perm filename DFTP.MAC[NET,MRC]15 blob sn#284630 filedate 1977-05-27 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00121 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00004 00002
C00008 00003
C00009 00004
C00012 00005
C00014 00006
C00015 00007
C00019 00008
C00021 00009
C00023 00010
C00026 00011
C00028 00012
C00034 00013
C00035 00014
C00039 00015
C00041 00016
C00042 00017
C00047 00018
C00061 00019
C00064 00020
C00067 00021
C00069 00022
C00070 00023
C00072 00024
C00076 00025
C00077 00026
C00079 00027
C00082 00028
C00083 00029
C00087 00030
C00090 00031
C00092 00032
C00093 00033
C00096 00034
C00098 00035
C00099 00036
C00102 00037
C00106 00038
C00107 00039
C00110 00040
C00112 00041
C00117 00042
C00118 00043
C00121 00044
C00127 00045
C00129 00046
C00131 00047
C00133 00048
C00137 00049
C00138 00050
C00139 00051
C00147 00052
C00150 00053
C00153 00054
C00154 00055
C00155 00056
C00160 00057
C00162 00058
C00164 00059
C00166 00060
C00168 00061
C00170 00062
C00172 00063
C00174 00064
C00176 00065
C00178 00066
C00180 00067
C00181 00068
C00184 00069
C00187 00070
C00189 00071
C00190 00072
C00192 00073
C00195 00074
C00197 00075
C00199 00076
C00202 00077
C00212 00078
C00213 00079
C00215 00080
C00217 00081
C00218 00082
C00220 00083
C00221 00084
C00222 00085
C00224 00086
C00226 00087
C00228 00088
C00229 00089
C00232 00090
C00233 00091
C00235 00092
C00237 00093
C00238 00094
C00240 00095
C00242 00096
C00244 00097
C00246 00098
C00248 00099
C00250 00100
C00252 00101
C00255 00102
C00257 00103
C00259 00104
C00263 00105
C00265 00106
C00266 00107
C00268 00108
C00269 00109
C00270 00110
C00271 00111
C00272 00112
C00273 00113
C00275 00114
C00276 00115
C00277 00116
C00279 00117
C00281 00118
C00283 00119
C00286 00120
C00288 00121
C00294 ENDMK
C⊗;

	TITLE	DFTP  Datacomputer File Transfer Program

; Bugs/Gripes to Bug-DFTP at MIT-AI
; Current DFTP hackers:	WRB@CCA(general, TENEX, TOPS-10)
;			MRC@MIT-AI(ITS, SU-AI, TOPS-10)
;			Gumpertz@CMU-10a (CMU, TOPS-10), aka RHG@MIT-AI

; The source for this program is kept:

; On the DATACOMPUTER as  <<<COMMON>DATACOMPUTER>DFTP.MAC  (DFTP format);
;	this is the most recent DFTP for Tenex, TOPS-20, TOPS-10, and
;	possibly ITS and SAIL as well.
; At MIT-AI as  DSK:MRC;DFTP >  (should be the same as the Datacomputer
;	version; the most recent working ITS version is  DSK:MRC;DFTP <
;	which might be the same file).
; At SU-AI as  DSK:DFTP.MAC[NET,MRC].  This is the most recent working
;	SAIL version, and is in SAIL "ETV" format.

IFNDEF F.TENX,<F.TENX==1>	; -1 IF ITS, 0 IF TOPS-10, 1 IF TENEX/TWENEX

IFNDEF F.PCAP,<F.PCAP==0>	; 0 IF PRIVILEGED CAPABILITIES UNRESTRICTED

IFNDEF F.SAIL,<F.SAIL==0>	; -1 IF TOPS-10 VERSION FOR SAIL
IFNDEF F.CMU,<F.CMU==0>		; -1 IF TOPS-10 VERSION FOR CMU
IFN F.SAIL!F.CMU,<F.TENX==0>

IF1,<
IFL F.TENX,<PRINTX ITS DFTP...>
IFE F.TENX,<
	IFE F.SAIL!F.CMU,<PRINTX TOPS-10 DFTP...>
	IFN F.SAIL,<PRINTX SAIL DFTP...>
	IFN F.CMU,<PRINTX CMU/TOPS-10 DFTP...>
>;IFE F.TENX
IFG F.TENX,<PRINTX TENEX DFTP...>
IFN F.PCAP,<PRINTX Privileged capabilities restricted>
>
IF2,<PRINTX ...Let's do that again...>

; REGISTER DEFINITIONS -- must be on page 1 for the "@" listing program

	R1==1
	R2==2
	R3==3
	R4==4
	R5==5
	R6==6
	R7==7
	R10==10
	R11==11
	R12==12
	R13==13
	R14==14
	R15==15
	R16==16
	R17==17

;	(SCRATCH REGISTERS)
	X1==1
	X2==2
	X3==3
	X4==4

;	(COMMONLY USED REGISTERS)
	IO==R5
	BP==R6
	FLAG==R15
	UTIL==R16
	STAK==R17

;	(TERMINAL COMMAND INPUT (RECOGNIZER) REGISTERS)
	TCIO==R2		; IO(REGISTER)
	TCIBP==R3		; B(YTE)P(OINTER)
	TCIACB==R4		; A(DDRESSOF)C(ONTROL)B(LOCK)
	TCITLP==R5		; T(RACE)L(IST)P(OINTER)
	TCITCC==R6		; T(RACE)C(OMMAND)C(OUNTER)
	TCIPBP==R7		; P(ARALLEL)B(YTE)P(OINTER)
	TCIPCC==R10		; P(ARALLEL)C(HARACTER)C(OUNTER)
	TCISBP==R11		; S(ERIAL)B(YTE)P(OINTER)
	TCISCC==R12		; S(ERIAL)C(HARACTER)C(OUNTER)
	TCIMAC==R13		; MA(TCHES--)C(OMMANDS)
	TCIMAN==R14		; MA(TCHES--)N(ULLCHARACTER)

IFN 0,<	;.XCREF is for the "@" listing program and should be ignored by MACRO-10
;;;	.XCREF R1,R2,R3,R4,R5,R6,R7,R10,R11,R12,R13,R14,R15,R16,R17
	.XCREF X1,X2,X3,X4,IO,BP,FLAG,UTIL,STAK
>;IFN 0

SUBTTL	Definitions

	DCHOST==37
	DCSOKT==203

	DEFALO==12

	SIZBLK==200
	SIZPAG==1000

	LBSIZE==100
	SBSIZE==20

SUBTTL	Macro Definitions for "Routines"

	SALL

DEFINE	BEGINR(SAVLST,%RETN)
<	..SAVL==0
	..SAVC==0
	IFIDN <SAVLST><ALL>,<..SAVL==77777>
	IFDIF <SAVLST><ALL>,<
		IRP SAVLST,<
			IFG <SAVLST>-20,<!!
				PRINTX SAVLST NOT A REGISTER>
			IFLE <SAVLST>-20,<
				IFN ..SAVL&1←SAVLST,<!!
					PRINTX SAVLST SAVED TWICE>
				..SAVL==..SAVL!1←SAVLST
				..SAVC==..SAVC+1>>>
	IFN ..SAVL,<
		..REG==17
		REPEAT 20,<
			IFN ..SAVL&1←..REG,<PUSH STAK,..REG>
			..REG==..REG-1>>
	DEFINE	.%RETN <%RETN>	; UNIQUE LOCATION FOR RETURN AND ENDR
	DEFINE	.%RETL <%RETN':!>
	..SFLG==0		; LARGEST SKIP RETURN
>

; IF RETURN CAN'T BE POPJ, THEN IT ASSEMBLES AS JRST TO ENDR CODE
;   JRST TO .%RETN FOR NOSKIP RETURN, .%RETN-N FOR SKIP RETURN
;   ..SFLG SIGNALS THAT SKIP CODE MUST BE ASSEMBLED IN ENDR
DEFINE	RETURN(SK,N)
<<IFB <SK>,<<IFE ..SAVC,<POPJ STAK,.%RETN>>+<IFN ..SAVC,<JRST .%RETN>>>>+<IFIDN <SK><SKIP>,<<IFG N-..SFLG,<..SFLG==N>>*0+<JRST .%RETN-N>>>>

; RETURN FOR USE WITH CONDITIONAL JUMPS
DEFINE	RETN(N)
<<IFB <N>,<<IFE ..SAVC,<.%RETN>>+<IFN ..SAVC,<.%RETN>>>>+<IFNB <N>,<<IFG N-..SFLG,<..SFLG==N>>*0+<.%RETN-N>>>>

; ENDR DECRIMENTS STAK, RESTORES REGS, RETURNS (POSSIBLY SKIPPING)
DEFINE	ENDR(SK,N)
<	IFB <SK>,<..N==0>
	IFIDN <SK><SKIP>,<..N==N
		IFG <..N-..SFLG>,<..SFLG==..N>>
	IFN <..SFLG>,<IFN <..N-..SFLG>,<JRST .%RETN-..N>
		REPEAT ..SFLG,<
			AOS -..SAVC(STAK)>>
	.%RETL
	..REG==0
	REPEAT 20,<
		IFN ..SAVL&1←..REG,<POP STAK,..REG
			..SAVL==..SAVL-1←..REG>
		..REG==..REG+1>
	POPJ STAK,>

DEFINE	CALLR(ROUTIN)
<	PUSHJ	STAK,ROUTIN>

SUBTTL	Other Macro definitions

DEFINE	TAIN(MSG)
<	HRRZI	X1,MSG
	CALLR	$TAIN$>

DEFINE	TCIN(CLIST,RSTR)
<	MOVE	TCIO,[RSTR,,CLIST]
	CALLR	$TCIN$>

DEFINE	TSIN(BUFFER,BUFS,MSG,NOECHO)
<	MOVE	IO,[BUFFER,,5*BUFS]
	IFB <NOECHO>,< HRRZI	UTIL,MSG>
	IFNB <NOECHO>,< HRROI	UTIL,MSG>
	CALLR	$TSIN$>

DEFINE	TNIN(MSG,RADIX)
<	IFB <RADIX>,< MOVE	IO,[MSG,,↑D10]>
	IFNB <RADIX>,< MOVE	IO,[MSG,,RADIX]>
	CALLR	$TNIN$>

DEFINE	TNOUT(REG,RADIX)
<	IFN <X1-REG>,< MOVE	X1,REG>
	IFB <RADIX>,< HRRZI	X2,↑D10>
	IFNB <RADIX>,< HRRZI	X2,RADIX>
	CALLR	$NOUT$>

DEFINE	DCNOUT(REG,RADIX)
<	IFN <X1-REG>,< MOVE	X1,REG>
	IFB <RADIX>,< HRROI	X2,↑D10>
	IFNB <RADIX>,< HRROI	X2,RADIX>
	CALLR	$NOUT$>

DEFINE	PATH(STRING,FLAGS)
<	IFB <FLAGS>,< HRRZI	FLAG,STRING>
	IFNB <FLAGS>,<
		HRRI	FLAG,STRING
		HRLI	FLAG,FLAGS>
	CALLR	$PATH$>

DEFINE	SCOPY(SOURCE,DESTIN)
<	ILDB	0,SOURCE
	JUMPE	0,.+3
	IDPB	0,DESTIN
	JRST	.-3
	MOVE	SOURCE,DESTIN
	IDPB	0,SOURCE>

DEFINE	XTCIL <		;(e)X(pand) T(erminal) C(ommand) I(nput) L(ist)
	..CMCH==0
	..CMWD==0
	..CNUM==0
	DEFINE TCIE (NAME, ROUTINE)
	<	..CNUM==..CNUM+1
		..IDX==0
		IRPC NAME<..IDX==..IDX+1>
		IFG <..IDX-..CMCH>,<..CMCH==..IDX>
	>;TCIE
	TCIL
	..CMWD==<<<..CMCH-1>/5>+1>

	.+4+..CNUM
	..CNUM
	..CMCH
	..CMWD

	DEFINE TCIE (NAME,ROUTINE)
	<	ROUTINE
	>;TCIE
	TCIL

	DEFINE TCIE (NAME,ROUTINE)
	<	ASCII	/NAME/
		..IDX==0
		IRPC NAME<..IDX==..IDX+1>
		..IDX==<..CMWD-<<<..IDX-1>/5>+1>>
		IFG ..IDX,<REPEAT ..IDX, <0>>
	>;TCIE
	TCIL
>;XTCIL

SUBTTL	System Dependent Definitions for ITS

IFL F.TENX,<DEFINE RELOC(ADDR)<LOC ADDR>>	; ABS ASSEMBLY ON ITS

; ((ITS))
IFL F.TENX,<
	SEARCH SITS
	LOC 150

	OPDEF THUD [.LOSE 1000]

;  Initialization routine, since have to load with DEC LOADER/LINK-10
; under DECUUO.  First load using DEC loader, flush DECUUO with 45$G
; and then D system command, then do INIT$G(or 150$G if no symbols).

INIT:	MOVSI (JUMPA)
	HRR .JBSA##
	.BREAK 12,[400001,,]		;set start address
	SETZ 1,
	MOVE [1,,2]
	BLT 150
	.BREAK 16,100000		;return to DDT
	JRST DFTP

; I/O Channels

	TTI==1		; TTY I/O
	TTO==2
	DCI==3		; Datalanguage I/O
	DCO==4
	ICP==5		; ICP channel
	DDI==6		; Data I/O
	DDO==7
	LCI==10		; Local input
	LCO==11		; Local output
 
; ITS network definitions

%NSCLS==0
%NSLSN==1
%NSRFC==2
%NSRCL==3
%NSRFS==4
%NSOPN==5
%NSRFN==6
%NSCLW==7
%NSCLI==10
%NSINP==11

DEFINE TBIN(REG)
<	.IOT TTI,REG
	CAIN REG,15
	 MOVEI REG,12
	CAIG REG,"z"
	 CAIGE REG,"a"
	  CAIA
	   TRZ REG," ">

OPDEF TBOUT [.IOT TTO,]


DEFINE TSOUT(STRING)
<	IRP STRING
<	MOVEI X1,STRING
	CALLR $STRIN
>>

;  Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.

$STRIN:	BEGINR
	HRLI X1,(POINT 7,)		; build a byte pointer
$STRI1:	ILDB X1				; get a character from string
	JUMPE RETN(0)			; quit when done
	.IOT TTO,			; output the character
	JRST $STRI1
	ENDR

DEFINE DCBIN(REG)
<	.IOT DCI,REG
	JUMPLE REG,QUIT2
	SKIPE FLAGDD
	 .IOT TTO,REG
>

OPDEF DCBOUT [.IOT DCO,]

DEFINE DCSOUT(STRING)
<	IRP STRING
<	MOVEI X1,STRING
	CALLR $DSTRI
>>

;  Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.

$DSTRI:	BEGINR
	HRLI X1,(POINT 7,)		; build a byte pointer
$DSTR1:	ILDB X1				; get a character from string
	JUMPE RETN(0)			; quit when done
	.IOT DCO,			; output the character
	SKIPE FLAGDD			; show DATALANGUAGE?
	 .IOT TTO,
	JRST $DSTR1			; and loop for more
	ENDR
>
; (((↑↑↑)))

SUBTTL	System Dependent Definitions for TOPS-10

; (((TOPS-10)))
IFE F.TENX,<
	TWOSEG
	RELOC	400000

	OPDEF THUD [JSP FLAG,OOPS]

IFN F.SAIL,<IFNDEF TTCALL,<OPDEF TTCALL [TTYUUO]>>

	DCCHAN==1
	DDCHAN==2
	LFCHAN==3
	LDCHAN==4

; DEFINITIONS FROM "IMP.MAC"
	.IBDEV==0
	.IBSTT==1
	.IBERR==1
	.IBLCL==2
	.IBHST==3
	.IBRMT==4
	.IUSTT==0
	.IUCON==3
	.IUCLS==4
	.IULSN==5
	.IULHS==15
	.IESOF==5
	.IESKT==11
	.IEDWN==13
	.IETIM==15

DEFINE	TBIN(REG)
<	TTCALL	0,REG
	CAIE REG,175
	 CAIN REG,176
	  MOVEI REG,33
	CAILE	REG,"Z"+40
	 JRST	.+3
	CAIL	REG,"A"+40
	 SUBI	REG,40>
OPDEF TBOUT [TTCALL 1,]
DEFINE	TSOUT(STRING)
<	IRP STRING
<	TTCALL	3,STRING>>

DEFINE	DCBIN(REG)
<	SKIPG	DCIBUF+2
	CALLR	NUTMI
	SOS	DCIBUF+2
	ILDB	REG,DCIBUF+1
	JUMPE REG,.-4>
DEFINE	DCBOUT(REG)
<	IDPB	REG,DCOBUF+1
	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT>
DEFINE	DCSOUT(STRING)
<	IRP STRING
<	HRRZI	X1,STRING
	CALLR	NUTMO>
	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT>
>
; (((↑↑↑)))

SUBTTL	System Dependent Definitions for TENEX

; (((TENEX)))
IFG F.TENX,<
	SEARCH	STENEX

	THUD==-1

DEFINE	TBIN(REG)
<	PBIN
	CAILE	X1,"Z"+40
	 JRST	.+3
	CAIL	X1,"A"+40
	 SUBI	X1,40
	IFN	<X1-REG>,< HRRZI	REG,(X1)>>
DEFINE	TBOUT(REG)
<	IFN	<X1-REG>,< HRRZI	X1,(REG)>
	PBOUT>
DEFINE	TSOUT(STRING)
<	IRP STRING
<	HRROI	X1,STRING
	PSOUT>>

DEFINE	DCBIN(REG)
<	MOVE	X1,DCIJFN
	BIN
	SKIPN	FLAGDD
	 JRST	.+3
	HRRZI	X1,(X2)
	PBOUT
	HRRZI	REG,(X2)>
DEFINE	DCBOUT(REG)
<	MOVE	X1,DCOJFN
	HRRZI	X2,(REG)
	BOUT
	MOVEI	X2,21
	MTOPR>
DEFINE	DCSOUT(STRING)
<	..IDX==1
	IRP STRING<..IDX==..IDX+2>
	SKIPN	FLAGDD
	 JRST	.+..IDX
	IRP STRING
<	HRROI	X1,STRING
	PSOUT>
	MOVE	X1,DCOJFN
	SETZ	X3,
	IRP STRING
<	HRROI	X2,STRING
	SOUT>
	MOVEI	X2,21
	MTOPR>
>
; (((↑↑↑)))

SUBTTL	Main Program

DFTP:
IFL F.TENX,<.SUSET [.RSNAME,,LCLSNM]
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVEI
		[('DSK')]
		['.FILE.']
		['(DIR) ']
		SETZ LCLSNM]
	 THUD				; INSIST ON AN ITS DIRECTORY
	.CLOSE				; THIS WILL PREVENT A THUD IN
					; LOCOO DUE TO BAD DIRECTORY
					; STORED IN LCLSNM.  LOCAL-CONNECT
					; CHECKS.
>
IFE F.TENX,<JFCL>
IFGE F.TENX,<RESET>
	MOVE	STAK,[IOWD STSIZ,STBEG]
	CALLR	S$INIT
	CALLR	D$INIT

; (((PCAP UNRESTRICTED)))
IFE F.PCAP,<
IFL F.TENX,<			; HACK FOR ITS VERSION FOR AUTOENABLE
	MOVEI UTIL,CMDM3
	.OPEN ['DSK'
	       SIXBIT/←DFTP←/
	       SIXBIT/ENABLE/]
>
	 MOVEI UTIL,CMDM2	; CAN ENABLE LATER ON
>
; (((↑↑↑)))
; (((PCAP RESTRICTED))))
IFN F.PCAP,<
;	(((ITS)))
	IFL F.TENX,<
		MOVEI UTIL,CMDM2
		.SUSET [.RXUNAME,,X1]
		.CALL [	SETZ
			SIXBIT/OPEN/
			MOVEI
			[('DSK')]
			['.FILE.']
			['(DIR) ']
			SETZ X1]
		MOVEI UTIL,CMDM1	; NO ITS DIRECTORY
>
;	(((↑↑↑)))
;	(((TOPS-10)))
	IFE F.TENX,<
		MOVEI	UTIL,CMDM1
;		(!DISABLE!)
>
;	(((↑↑↑)))
;	(((TENEX)))
	IFG F.TENX,<
		MOVEI	UTIL,CMDM1
		MOVEI	X1,400000	; FOR THIS FORK
		RPCAP
		TRNE	X2,600000	; (1B18+1B19) WHEEL OR OPER
		 MOVEI	UTIL,CMDM2
>
;	(((↑↑↑)))
>
; (((↑↑↑)))
IFL F.TENX,<.CLOSE>
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD
RENTER:	MOVE	STAK,[IOWD STSIZ,STBEG]
CMDNEW:	TSOUT	<CRLF>
CMDCMD:	JRST	@CMDMOD
CMDM1:	TSOUT	<[ASCIZ/*/]>
	TCIN	(CMDMC1,[ASCIZ/*/])
	 JRST	CMDCMD
	 JRST	CMDNEW
	JRST	(FLAG)
CMDM2:	TSOUT	<[ASCIZ/*/]>
	TCIN	(CMDMC2,[ASCIZ/*/])
	 JRST	CMDCMD
	 JRST	CMDNEW
	JRST	(FLAG)
CMDM3:	TSOUT	<[ASCIZ/!/]>
	TCIN	(CMDMC3,[ASCIZ/!/])
	 JRST	CMDCMD
	 JRST	CMDNEW
	JRST	(FLAG)

SUBTTL	Terminal Input Dispatch Tables

DEFINE TCIL <
IFG ..MODE-2,<	TCIE ALLOCATE,CALO >
		TCIE ATTACH,CATT
		TCIE BIG,CBIG
IFG ..MODE-2,<	TCIE CHANGE,CCHA >
		TCIE CONNECT,CCON
IFG ..MODE-2,<	TCIE CREATE,CCRE >
		TCIE DELETE,CDEL
		TCIE DIRECTORY,CDIR
IFG ..MODE-2,<	TCIE DISABLE,CDIS >
IFE ..MODE-2,<	TCIE ENABLE,CENA >
IFGE F.TENX,<	TCIE EXAMINE,CEXA >		;Not implemented for ITS
IFG F.TENX,<	TCIE EXEC,CEXE >		;TENEX only
		TCIE EXPUNGE,CEXP
		TCIE GET,CGET
IFG ..MODE-2,<	TCIE LINK,CLIN >
		TCIE LIST,CLIS
IFL F.TENX,<	TCIE LOCAL-CONNECT,CLOC >	;ITS only
IFE F.TENX,<	TCIE LOCAL-DIRECTORY,CLOD >	;TOPS-10 only
IFE F.TENX,<	TCIE LOCAL-STRUCTURE,CLOS >	;TOPS-10 only
IFE F.TENX,<	TCIE LOCAL-USER,CLOU >		;TOPS-10 only
		TCIE NO-DATALANGUAGE,CNOD
		TCIE PUT,CPUT
		TCIE QUIT,CQUI
		TCIE REMOVE,CREM
		TCIE RENUMBER,CREN
		TCIE RETRIEVE,CRET
		TCIE SHOW-DATALANGUAGE,CSOD
		TCIE STORE,CSTO
IFL F.TENX,<	TCIE TERSE,CTER >		;ITS only (why? -RHG)
		TCIE TIME-TRANSFERS,CTTR
		TCIE UNDELETE,CUND
		TCIE UNTIME-TRANSFERS,CUTR
IFL F.TENX,<	TCIE VERBOSE,CVER >		;ITS only (why? -RHG)
>;TCIL

CMDMC1:	..MODE==1
	XTCIL
CMDMC2:	..MODE==2
	XTCIL
CMDMC3:	..MODE==3
	XTCIL

SUBTTL	Top level commands

CALO:	PATH	([ASCIZ/ ALLOCATE /],PATHNR!PATHCA)
	 JRST	CMDCMD
	TSOUT	<[ASCIZ/ Megabits: /]>
CALO1:	TNIN	([ASCIZ/ Megabits: /])
	 JRST	CMDCMD
	JUMPN	IO,CALO2
	MOVEI	IO,"G"-100
	TBOUT	<IO>
	JRST	CALO1
CALO2:	MOVEM	IO,ABUF
	TSOUT	<CRLF>
	CALLR	DALO
	JRST	CMDCMD

CATT:	PATH	([ASCIZ/ ATTACH /],PATHNR!PATHCT)
	 JRST	CMDCMD
	CALLR	DATT
	JRST	CMDCMD

CBIG:	PATH	([ASCIZ/ BIG /],PATHNR!PATHCA)
	 JRST	CMDCMD
	CALLR	DBIG
	JRST	CMDCMD

CCHA:	PATH	([ASCIZ/ CHANGE /],PATHNR!PATHCC!PATHAD!PATHAC)
	 JRST	CMDCMD
	CALLR	DCHA
	JRST	CMDCMD

CCON:	PATH	([ASCIZ/ CONNECT /],PATHNR!PATHCA!PATHAD)
	 JRST	CMDCMD
	CALLR	DCON
	JRST	CMDCMD

CCRE:	PATH	([ASCIZ/ CREATE /],PATHNR!PATHCA)
	 JRST	CMDCMD
	CALLR	DCRE
	JRST	CMDCMD

CDEL:	PATH	([ASCIZ/ DELETE /],PATHNP!PATHFR!PATHAS!PATHAC!PATHAV)
	 JRST	CMDCMD
	CALLR	DDEL
	JRST	CMDCMD

CDIR:	PATH	([ASCIZ/ DIRECTORY /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST	CMDCMD
	MOVE	IO,CMDMOD
	CAIN	IO,CMDM3
	 JRST	CDIR1
	TSOUT	<[ASCIZ/**/]>
	TCIN	(CDIRC,[ASCIZ/**/])
	 JRST	CMDCMD
	 JRST	CDIR2
	JRST	CDIR3
CDIR1:	TSOUT	<[ASCIZ/!!/]>
	TCIN	(CDIRC,[ASCIZ/!!/])
	 JRST	CMDCMD
	 JRST	CDIR2
	JRST	CDIR3
CDIR2:	MOVEI	FLAG,DD$T
	TSOUT	<[ASCIZ/TERSE/]>
CDIR3:	TSOUT	<CRLF>
	CALLR	DDIR
	JRST	CMDCMD

CDIRC:
DEFINE TCIL <
	TCIE DELETED,DD$D
	TCIE TERSE,DD$T
	TCIE VERBOSE,DD$V
>;TCIL
	XTCIL

CDIS:	TSOUT	<CRLF>
	MOVEI	UTIL,CMDM2
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD

CENA:	TSOUT	<CRLF>
	MOVEI	UTIL,CMDM3
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD

CEXA:	PATH	([ASCIZ/ EXAMINE /],PATHNP!PATHFR!PATHAV!PATHAS)
	 JRST	CMDCMD
	TSOUT	<[ASCIZ/ Lines per page: /]>
	TNIN	([ASCIZ/ Lines per page: /])
	 JRST	CMDCMD
	JUMPN	IO,CEXA0
	MOVE	IO,DEXA$P
	SKIPN	IO
	 MOVEI	IO,↑D20
	TNOUT	<IO>
CEXA0:	MOVEM	IO,DEXA$P
	TSOUT	<CRLF>
	MOVE	UTIL,VBUF
	LDB	IO,[350700,,FBUF]
	CAIN	IO,"*"
	 SETO	UTIL,
	LDB	IO,[350700,,EBUF]
	CAIN	IO,"*"
	 SETO	UTIL,
	MOVEM	UTIL,DEXA$S
	CALLR	DEXA
	 JRST	CMDCMD
	JRST	CMDCMD

; (((TENEX)))
IFG F.TENX,<
CEXE:	HRROI	X1,CRLF
	PSOUT
	HRLZI	X1,(1B1)	; INFERIOR GETS THIS FORK'S CAPABILITIES
	CFORK			; CREATE FORK
	 JRST	CMDCMD
	HRLI	UTIL,(X1)
	HRLZI	X1,(1B2+1B17)
	SKIPN	FLAG20
	 HRROI	X2,[ASCIZ/<SYSTEM>EXEC.SAV/]
	SKIPE	FLAG20
	 HRROI	X2,[ASCIZ/<SYSTEM>EXEC.EXE/]
	GTJFN
	 JRST	CEXE0
	HRRI	UTIL,(X1)
	HRRZI	X1,-1
	RFMOD
	MOVE	R10,X2
	SKIPN	FLAG20
	 JRST	.+3
	TRO	X2,004000
	SFMOD
	RFCOC
	MOVE	R11,X2
	MOVE	R12,X3
	MOVE	X1,UTIL
	GET			; LOAD EXEC INTO FORK
	HLR	X1,UTIL
	SETZ	X2,
	SFRKV			; START FORK AT MAIN STARTUP
	WFORK
	HRRZI	X1,-1
	MOVE	X2,R10
	SFMOD
	MOVE	X2,R11
	MOVE	X3,R12
	SFCOC
CEXE0:	HLR	X1,UTIL
	KFORK
	JRST	CMDCMD
>
; (((↑↑↑)))

CEXP:	PATH	([ASCIZ/ EXPUNGE /],PATHNR!PATHCC!PATHAD!PATHAC)
	 JRST	CMDCMD
	CALLR	DEXP
	JRST	CMDCMD

CGET:	PATH	([ASCIZ/ GET /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
	 JRST	CMDCMD
	CALLR	DGET
	 JRST	CMDCMD
	JRST	CMDCMD

CLIN:	TSOUT	<CRLF>
	CALLR	DLIN
	JRST	CMDCMD

CLIS:	PATH	([ASCIZ/ LIST /],PATHNR!PATHCC!PATHAS)
	 JRST	CMDCMD
	MOVE	IO,CMDMOD
	CAIN	IO,CMDM3
	 JRST	CLIS1
	TSOUT	<[ASCIZ/**/]>
	TCIN	(CLISC1,[ASCIZ/**/])
	 JRST	CMDCMD
	 JRST	CLIS2
	JRST	CLIS3
CLIS1:	TSOUT	<[ASCIZ/!!/]>
	TCIN	(CLISC2,[ASCIZ/!!/])
	 JRST	CMDCMD
	 JRST	CLIS2
	JRST	CLIS3
CLIS2:	MOVEI	FLAG,DL$T
	TSOUT	<[ASCIZ/TERSE/]>
CLIS3:	TSOUT	<CRLF>
	CALLR	DLIS
	JRST	CMDCMD

CLISC1:
DEFINE TCIL <
	TCIE TERSE,DL$T
	TCIE VERBOSE,DL$V
>;TCIL
	XTCIL
CLISC2:
DEFINE TCIL <
	TCIE PROTECTION,DL$P
	TCIE TERSE,DL$T
	TCIE VERBOSE,DL$V
>;TCIL
	XTCIL

; (((ITS)))
IFL F.TENX,<
CLOC:	TBOUT [" "]
	SETZM ABUF
	SETZM ABUF+1
	MOVE IO,[ABUF,,6]
	HRRZI UTIL,[ASCIZ/ LOCAL-CONNECT /]
	CALLR $TSIN$
	 JRST CMDCMD
	JUMPE UTIL,[	.SUSET [.RSNAME,,LCLSNM]
			TSOUT <[ASCIZ/(default)/],CRLF>
			JRST CMDCMD]
	TSOUT <CRLF>
	SETZM LCLSNM
	MOVE X1,[POINT 6,LCLSNM]
	MOVE X2,[POINT 7,ABUF]
	ILDB X2
	SUBI " "
	IDPB X1
	SOJG UTIL,.-3
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVEI
		[('DSK')]
		['.FILE.']
		['(DIR) ']
		SETZ LCLSNM]
	 JRST [	TSOUT <[ASCIZ/ (No such directory)/],CRLF,[ASCIZ/ LOCAL-CONNECT/]>
		JRST CLOC]
	.CLOSE
	JRST CMDCMD
>
; (((↑↑↑)))

; (((TOPS-10)))
IFE F.TENX,<
CLOD:	TTCALL	3,CRLF
	SETZM	LUTDSP
CLOD1:	CALLR	LUTDS
	 JRST	CMDCMD
	TTCALL	1,[" "]
	TTCALL	3,LUTDSF
	TTCALL	3,CRLF
	JRST	CLOD1

CLOS:	MOVEI	IO," "
	TTCALL	1,IO
	TSIN	(UBUF2,SBSIZE,[ASCIZ/ LOCAL-STRUCTURE /])
	 JRST	CMDCMD
	TTCALL	3,CRLF
	MOVE	BP,[440700,,UBUF2]
CLOS1:	ILDB	IO,BP
	JUMPE	IO,CLOS2
	CAIE	IO,":"
	 JRST	CLOS1
	SETZ	IO,
	DPB	IO,BP
CLOS2:	HRRZI	IO,UBUF2
	CALLR	LUTFN
	MOVE	IO,LFILE
	DEVCHR	IO,
	TLNE	IO,200000
	 JRST	CLOS3
	TTCALL	3,[ASCIZ/ (Local structure must be a disk)
/]
	JRST	CMDCMD
CLOS3:	MOVE	IO,LFILE
	MOVEM	IO,LFCHAS+1
	JRST	CMDCMD

CLOU:	TTCALL	3,[ASCIZ/
 Project: /]
IFE F.SAIL,<
	TNIN	([ASCIZ/ Project: /],10)
	 JRST	CMDCMD
>;IFE F.SAIL
IFN F.SAIL,<
	SETZM ABUF
	TSIN	(ABUF,3,<[ASCIZ/ Project:/]>)
	 JRST CMDCMD
	SETZ IO,
	MOVE X1,[POINT 7,ABUF]
REPEAT 3,<
	ILDB X2,X1
	JUMPE X2,CLOU1A
	LSH IO,6
	ADDI IO,-" "(X2)
>;REPEAT 3
>;IFN F.SAIL
CLOU1A:	HRLI	UTIL,(IO)
	JUMPN	IO,CLOU1
	GETPPN IO,
	 JFCL
	HLLZ UTIL,IO
	OUTSTR [ASCIZ/(self)/]
CLOU1:	TTCALL	3,[ASCIZ/
 Programmer: /]
IFE F.SAIL,<
	TNIN	([ASCIZ/ Programmer: /],10)
	 JRST	CMDCMD
>;IFE F.SAIL
IFN F.SAIL,<
	PUSH STAK,UTIL
	SETZM ABUF
	TSIN	(ABUF,3,<[ASCIZ/ Programmer:/]>)
	 JRST [	POP STAK,UTIL
		JRST CMDCMD]
	SETZ IO,
	POP STAK,UTIL
	MOVE X1,[POINT 7,ABUF]
REPEAT 3,<
	ILDB X2,X1
	JUMPE X2,CLOU2A
	LSH IO,6
	ADDI IO,-" "(X2)
>;REPEAT 3
>;IFN F.SAIL
CLOU2A:	HRRI	UTIL,(IO)
	JUMPN	IO,CLOU2
	GETPPN IO,
	 JFCL
	HRR UTIL,IO
	OUTSTR [ASCIZ/(self)/]
CLOU2:	TTCALL	3,CRLF
	RELEAS	LDCHAN,
	MOVEM	UTIL,LDIR
	MOVE	IO,[SIXBIT/UFD/]
	MOVEM	IO,LDIR+1
	SETZM	LDIR+2
IFE F.SAIL,<MOVE IO,[1,,1]>
IFN F.SAIL,<MOVE IO,[SIXBIT/  1  1/]>
	MOVEM	IO,LDIR+3
	MOVE	IO,LFCHAS+1
	MOVEM	IO,LDCHAS+1
	OPEN	LDCHAN,LDCHAS
	 JRST	CLOU4
	LOOKUP	LDCHAN,LDIR
	 JRST	CLOU4
	RELEAS	LDCHAN,
	MOVEM UTIL,LFIPPN
	JRST	CMDCMD
CLOU4:	 TTCALL	3,[ASCIZ/ (No such directory)
/]
	JRST	CMDCMD
>
; (((↑↑↑)))

CNOD:	SETZM	FLAGDD
	JRST	CMDNEW

CPUT:	PATH	([ASCIZ/ PUT /],PATHNP!PATHFR!PATHLR!PATHAS)
	 JRST	CMDCMD
	CALLR	DPUT
	 JRST	CMDCMD
	JRST	CMDCMD

CQUI:	TAIN	<[ASCIZ/ [Confirm]/]>
	 JRST	CMDCMD
	 JRST	CMDCMD
	JRST	QUIT

CREM:	PATH	([ASCIZ/ REMOVE /],PATHNR!PATHCC!PATHAS!PATHAC)
	 JRST	CMDCMD
	CALLR	DREM
	JRST	CMDCMD

CREN:	PATH	([ASCIZ/ RENUMBER /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST	CMDCMD
	SKIPLE	VBUF
	 JRST	CREN2
	SKIPE	VBUF
	 JRST	CREN1
	LDB	UTIL,[350700,,FBUF]
	CAIN	UTIL,"*"
	 JRST	CREN1
	LDB	UTIL,[350700,,EBUF]
	CAIN	UTIL,"*"
	 JRST	CREN1
	JRST	CREN2
CREN1:	TSOUT	<[ASCIZ/ (A version number is required if *'s are used.)/],CRLF>
	JRST	CMDCMD
CREN2:	TSOUT	<[ASCIZ/ New version number: /]>
	TNIN	([ASCIZ/ New version number: /])
	 JRST	CMDCMD
	JUMPN	IO,CREN3
	MOVEI	IO,"1"
	TBOUT	<IO>
	MOVEI	IO,1
CREN3:	MOVEM	IO,ABUF
	TSOUT	<CRLF>
	CALLR	DREN
	JRST	CMDCMD

CRET:	PATH	([ASCIZ/ RETRIEVE /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
	 JRST	CMDCMD
	CALLR	DGET
	 JRST	CMDCMD
	JRST	CMDCMD

CSOD:	SETOM	FLAGDD
	JRST	CMDNEW

CSTO:	PATH	([ASCIZ/ STORE /],PATHNP!PATHFR!PATHLR!PATHAS)
	 JRST	CMDCMD
	CALLR	DPUT
	 JRST	CMDCMD
	JRST	CMDCMD

CTER:	SETOM FLAGNN
	SETZM FLAGDD
	SETZM FLAGTT
	JRST CMDNEW

CTTR:	SETOM	FLAGTT
	JRST	CMDNEW

CUND:	PATH	([ASCIZ/ UNDELETE /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST	CMDCMD
	CALLR	DUND
	JRST	CMDCMD

CUTR:	SETZM	FLAGTT
	JRST	CMDNEW

CVER:	SETZM FLAGNN
	JRST CMDNEW

SUBTTL	PATH INPUT AND TRANSLATION
PRINTX (path input routines)

; FLAG DEFINITIONS
	PATHNR==400000		; NODE REQUIRED
	PATHNP==200000		; NODE POSSIBLE
	PATHNF==100000		; NODE FOUND
	PATHFR==040000		; FILE REQUIRED
	PATHFF==020000		; FILE FOUND
	PATHCT==004000		; CONTEXT TOP
	PATHCA==002000		; CONTEXT ATTACH
	PATHCC==001000		; CONTEXT CONNECT
	PATHLR==000400		; LOCAL TO REMOTE
	PATHRL==000200		; REMOTE TO LOCAL
	PATHAS==000040		; ALLOW SETS
	PATHAD==000020		; ALLOW (NON-SET) DEFAULT
	PATHAV==000010		; ALLOW VERSIONS
	PATHAC==000004		; ACKNOWLEDGE [CONFIRM]

; PATH INPUT CONTROL
;   IN: TCIO -- LAST CHARACTER INPUT (TCIN)
;	FLAG -- FLAGS,,COMMAND STRING POINTER
;
$PATH$:	BEGINR	<IO,UTIL>
; (((TENEX)))
IFG F.TENX,<
	TLNE	FLAG,PATHLR
	 TLO	FLAG,PATHAV
>
; (((↑↑↑)))
	MOVEI	IO," "
	TBOUT	<IO>
	MOVE	IO,[GBUF1,,5*LBSIZE]
	SETZ	UTIL,
	CALLR	P$IN
	 RETURN
	PUSH	STAK,IO
	MOVE	IO,[GBUF1,,NBUF]
	MOVE	UTIL,[FBUF,,EBUF]
	CALLR	P$PP
	POP	STAK,IO
	MOVEM	UTIL,VBUF
	TLNN	FLAG,PATHAC
	 JRST	PAT$10
	TAIN	<[ASCIZ/ [Confirm]/]>
	 RETURN
	 RETURN
	RETURN	SKIP,1
PAT$10:	TLNE	FLAG,PATHRL!PATHLR
	 JRST	PAT$11
	TSOUT	<CRLF>
	RETURN	SKIP,1
PAT$11:	PUSH	STAK,IO
	MOVE	IO,[FBUF,,EBUF]
; (((TENEX)))
IFG F.TENX,<
	TLNE	FLAG,PATHRL
	 SETZ	UTIL,
>
; (((↑↑↑)))
	CALLR	P$LF
	POP	STAK,IO
	CAIN	IO,33
	 JRST	PAT$20
	CAIN	IO," "
	 JRST	PAT$20
; (((TOPS-10+ITS)))
IFLE F.TENX,<
PAT$12:	TSOUT <CRLF>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
PAT$12:	SKIPE	LJFN
	 JRST	.+3
	HRROI	X1,CRLF
	PSOUT
>
; (((↑↑↑)))
	RETURN	SKIP,1
PAT$20:	TLNE	FLAG,PATHLR
	 JRST	PAT$21
	TLNE	FLAG,PATHRL
	 JRST	PAT$22
	JRST	PAT$23
PAT$21:	TLNE	FLAG,PATHNF
	 JRST	PAT$12
; (((TENEX)))
IFG F.TENX,<
	TLZ	FLAG,PATHAV
>
; (((↑↑↑)))
	JRST	PAT$23
; (((TOPS-10+ITS)))
IFLE F.TENX,<
PAT$22:	TLZ	FLAG,PATHNR!PATHNP!PATHAV
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
PAT$22:	SKIPN	LJFN
	 JRST	.+4
	HRROI	X1,CRLF
	PSOUT
	RETURN	SKIP,1
	TLZ	FLAG,PATHNR!PATHNP
>
; (((↑↑↑)))
PAT$23:	TSOUT	<[ASCIZ/ [As] /]>
	MOVE	IO,[GBUF2,,5*LBSIZE]
	MOVE	UTIL,[GBUF1,,[ASCIZ/ [As] /]]
	CALLR	P$IN
	 RETURN
	TLNE	FLAG,PATHLR
	 JRST	PAT$24
	TLNE	FLAG,PATHRL
	 JRST	PAT$25
	RETURN
PAT$24:	MOVE	IO,[GBUF2,,NBUF]
	MOVE	UTIL,[FBUF,,EBUF]
	CALLR	P$PP
	MOVEM	UTIL,VBUF
	TSOUT	<CRLF>
	RETURN	SKIP,1
PAT$25:	MOVE	IO,[GBUF2,,GBUF1]
	MOVE	UTIL,[FSBUF,,ESBUF]
	CALLR	P$PP
	MOVE	IO,[FSBUF,,ESBUF]
	CALLR	P$LF
; (((TOPS-10+ITS)))
IFLE F.TENX,<
	TSOUT <CRLF>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	SKIPE	LJFN
	 JRST	.+3
	HRROI	X1,CRLF
	PSOUT
>
; (((↑↑↑)))
	ENDR	SKIP,1

; PATH INPUT
;   IN: IO -- POINTER TO PATH BUFFER,,SIZE OF PATH BUFFER
;       UTIL -- FIRST PATH,,TIE MSG (OR ZERO)
;       FLAG -- (SAME AS $PATH$)
;   OUT: IO -- LAST CHARACTER INPUT
;        UTIL -- COUNT OF CHARACTERS
;   FLAGS:
	P$I$AE==400000		; ANCHOR ENCOUNTERED (<)
	P$I$DE==200000		; DESCENDER ENCOUNTERED (>,.)
	P$I$SE==100000		; SET ENCOUNTERED (*)
	P$I$TE==040000		; TRAILING NODE SET ENCOUNTERED (**)
	P$I$PW==010000		; INPUT PASSWORD
	P$I$CC==004000		; <
	P$I$CA==002000		; <<
	P$I$CT==001000		; <<<
	P$I$EP==000400		; EXTENSION BEING PROCESSED
	P$I$VP==000200		; VERSION BEING PROCESSED
;
P$IN:	BEGINR	<BP,R10,R11,R12,R13>
	SETZ	R10,
	MOVE	R11,IO
	MOVE	R12,UTIL
	HLR	BP,IO
	HRLI	BP,(POINT 7,)
	SETZ	UTIL,
P$ICHR:	TBIN	<IO>
	CAIN	IO,"R"-100
	 JRST	P$IREP
	CAIN	IO,"A"-100
	 JRST	P$IDEL
	CAIN	IO,"U"-100
	 JRST	P$IENR
	CAIN	IO,"X"-100
	 JRST	P$IENR
	CAIN	IO,177
	 JRST	P$IDEL
	CAIN	IO,15
	 JRST	P$ICHR
	CAIN	IO,12
	 JRST	P$IEND
	CAIN	IO,33
	 JRST	P$IEND
	CAIN	IO,37
	 JRST	P$IEND
	CAIGE	IO," "
	 JRST	P$IBAD
	CAIN	IO,42
	 JRST	P$IBAD
	CAIN	IO,47
	 JRST	P$IBAD
	TRNE	R10,P$I$TE
	 JRST	P$IBAD
	CAIL	UTIL,(R11)
	 JRST	P$IBAD
	TRNE	R10,P$I$PW
	 JRST	P$ICHP
	CAIN	IO," "
	 JRST	P$IEND
	CAIN	IO,"?"
	 JRST	P$IBAD
	CAIN	IO,"*"
	 JRST	P$ISS
	TRNE	R10,P$I$VP
	 JRST	P$ISVN
	CAIN	IO,";"
	 JRST	P$ISVS
	CAIN	IO,":"
	 JRST	P$IPON
	CAIN	IO,"<"
	 JRST	P$ISA
	CAIN	IO,">"
	 JRST	P$ISD1
	CAIN	IO,"."
	 JRST	P$ISD2
	TRNE	R10,P$I$SE
	 JRST	P$IBAD
	TRZ	R10,P$I$AE!P$I$DE
P$ICHE:	IDPB	IO,BP
	TBOUT	<IO>
	AOJA	UTIL,P$ICHR
P$ICHP:	CAIN	IO,">"
	 JRST	P$IPOF
	CAIN	IO,"'"
	 JRST	P$IBAD
	IDPB	IO,BP
	AOJA	UTIL,P$ICHR
P$ISA:	TLNN	FLAG,PATHNR!PATHNP
	 JRST	P$IBAD
	TRNN	R10,P$I$CC
	 JRST	P$ISA1
	TRNN	R10,P$I$CA
	 JRST	P$ISA2
	TRNN	R10,P$I$CT
	 JRST	P$ISA3
	JRST	P$IBAD
P$ISA1:	JUMPN	UTIL,P$IBAD
	TRO	R10,P$I$AE!P$I$CC
	JRST	P$ICHE
P$ISA2:	CAIE	UTIL,1
	 JRST	P$IBAD
	TRO	R10,P$I$AE!P$I$CA
	JRST	P$ICHE
P$ISA3:	CAIE	UTIL,2
	 JRST	P$IBAD
	TRO	R10,P$I$AE!P$I$CT
	JRST	P$ICHE
P$ISD1:	TLNN	FLAG,PATHNR!PATHNP
	 JRST	P$IBAD
	JUMPE	UTIL,P$IBAD
	TRNE	R10,P$I$AE!P$I$EP
	 JRST	P$IBAD
	TLNN	FLAG,PATHFR
	 JRST	.+3
	TRNE	R10,P$I$SE
	 JRST	P$IBAD
	TROE	R10,P$I$DE
	 JRST	P$IBAD
	TRZ	R10,P$I$SE
	JRST	P$ICHE
P$ISD2:	TLNN	FLAG,PATHFR
	 JRST	P$IBAD
	JUMPE	UTIL,P$IBAD
	TRNE	R10,P$I$AE!P$I$DE!P$I$EP
	 JRST	P$IBAD
	TRZ	R10,P$I$SE
	TRO	R10,P$I$DE!P$I$EP
	JRST	P$ICHE
P$ISVS:	TLNN	FLAG,PATHAV
	 JRST	P$IBAD
	TLNN	FLAG,PATHFR
	 JRST	P$IBAD
	JUMPE	UTIL,P$IBAD
	TRNE	R10,P$I$AE!P$I$VP
	 JRST	P$IBAD
	TRNN	R10,P$I$DE
	 JRST	.+3
	TRNN	R10,P$I$EP
	 JRST	P$IBAD
	TRZ	R10,P$I$SE!P$I$EP
	TRO	R10,P$I$VP!P$I$DE
	JRST	P$ICHE
P$ISVN:	CAIL	IO,"0"
	 CAILE	IO,"9"
	  JRST	P$IBAD
	TRNE	R10,P$I$SE
	 JRST	P$IBAD
	TRZ	R10,P$I$DE
	JRST	P$ICHE
P$ISS:	TLNN	FLAG,PATHAS
	 JRST	P$IBAD
	TRNE	R10,P$I$SE
	 JRST	P$IST
	TRZN	R10,P$I$AE!P$I$DE
	 JUMPN	UTIL,P$IBAD
	TRO	R10,P$I$SE
	JRST	P$ICHE
P$IST:	TLNE	FLAG,PATHFR
	 JRST	P$IBAD
	TRNE	R10,P$I$EP!P$I$VP
	 JRST	P$IBAD
	TRO	R10,P$I$TE
	JRST	P$ICHE
P$IPON:	TLNN	FLAG,PATHNR!PATHNP
	 JRST	P$IBAD
	TRNE	R10,P$I$AE!P$I$DE!P$I$SE
	 JRST	P$IBAD
	MOVEI	X1,1(UTIL)
	CAIL	X1,(R11)
	 JRST	P$IBAD
	IDPB	IO,BP
	TBOUT	<IO>
	MOVEI	X1,"P"-100
	IDPB	X1,BP
	ADDI	UTIL,2
	TRO	R10,P$I$PW
	JRST	P$ICHR
P$IPOF:	MOVEI	X1,1(UTIL)
	CAIL	X1,(R11)
	 JRST	P$IBAD
	MOVEI	X1,"P"-100
	IDPB	X1,BP
	IDPB	IO,BP
	TBOUT	<IO>
	ADDI	UTIL,2
	TRZ	R10,P$I$PW
	TRO	R10,P$I$DE
	JRST	P$ICHR
P$IBAD:	MOVEI	IO,"G"-100
	TBOUT	<IO>
	JRST	P$ICHR
P$IREP:	TSOUT	<CRLF>
	TSOUT	<(FLAG)>
	JUMPE	R12,P$IR04
	HLR	R13,R12
	HRLI	R13,(POINT 7,)
	TRZ	R10,P$I$PW
P$IR01:	ILDB	IO,R13
	JUMPE	IO,P$IR03
	CAIN	IO,"P"-100
	 JRST	P$IR02
	TRNE	R10,P$I$PW
	 JRST	P$IR01
	TBOUT	<IO>
	JRST	P$IR01
P$IR02:	TRC	R10,P$I$PW
	JRST	P$IR01
P$IR03:	TSOUT	<(R12)>
P$IR04:	HRRZI	IO,(BP)
	HLR	R13,R11
	CAIGE	IO,(R13)
	 JRST	P$ICHR
	HRLI	R13,(POINT 7,)
	TRZ	R10,P$I$PW
P$IR05:	CAMN	R13,BP
	 JRST	P$ICHR
	ILDB	IO,R13
	CAIN	IO,"P"-100
	 JRST	P$IR06
	TRNE	R10,P$I$PW
	 JRST	P$IR05
	TBOUT	<IO>
	JRST	P$IR05
P$IR06:	TRC	R10,P$I$PW
	JRST	P$IR05
P$IDEL:	JUMPE	UTIL,P$IENR
	MOVEI	IO,"\"
	TBOUT	<IO>
	LDB	IO,BP
	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	CAIN	IO,"P"-100
	 JRST	P$ID01
	LDB	X1,BP
	CAIN	X1,"P"-100
	 JRST	P$ID02
	TRNE	R10,P$I$PW
	 SOJA	UTIL,P$ICHR
	TBOUT	<IO>
	TRZ	R10,P$I$AE!P$I$DE!P$I$SE!P$I$TE
	CAIN	IO,"."
	 TRZ	R10,P$I$EP
	CAIN	IO,";"
	 TRZ	R10,P$I$VP
	CAIE	IO,"<"
	 JRST	P$ID00
	TRZE	R10,P$I$CT
	 JRST	P$ID00
	TRZE	R10,P$I$CA
	 JRST	P$ID00
	TRZ	R10,P$I$CC
P$ID00:	SUBI	UTIL,1
	JUMPE	UTIL,P$ICHR
	LDB	X1,BP
	CAIN	X1,"<"
	 TRO	R10,P$I$AE
	CAIN	X1,">"
	 TRO	R10,P$I$DE
	CAIN	X1,"."
	 TRO	R10,P$I$DE
	CAIN	X1,";"
	 TRO	R10,P$I$DE
	CAIN	X1,"*"
	 TRO	R10,P$I$SE
	JRST	P$ICHR
P$ID01:	TRZ	R10,P$I$PW
	LDB	IO,BP
	JRST	P$ID03
P$ID02:	TROE	R10,P$I$PW
	 SOJA	UTIL,P$ICHR
	TRZ	R10,P$I$DE
P$ID03:	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	TBOUT	<IO>
	SUBI	UTIL,2
	JRST	P$ICHR
P$IENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETO	IO,
	SETZ	UTIL,
	RETURN
P$IEND:	CAIN	IO,12
	 JRST	P$IENL
	CAIN	IO,37
	 JRST	P$IENL
	TLNN	FLAG,PATHAS
	 JRST	P$IENV
	JUMPE	UTIL,P$IENV
	LDB	R13,BP
	CAIN	R13,">"
	 JRST	P$IENT
	TLNN	FLAG,PATHFR
	 JRST	P$IENV
	TLNE	FLAG,PATHAS
	 JRST	P$IENV
	TRNE	R10,P$I$AE
	 JRST	P$IBAD
	JRST	P$IENV
P$IENL:	TLNN	FLAG,PATHFR
	 JRST	P$IENV
	TRNE	R10,P$I$AE
	 JRST	P$IBAD
P$IENV:	TRNN	R10,P$I$DE
	 JRST	.+3
	TRNN	R10,P$I$EP
	 JRST	P$IBAD
; (((TENEX)))
IFG F.TENX,<
	TLNN	FLAG,PATHFR
	 JRST	P$IE$6
	TLNN	FLAG,PATHLR!PATHRL
	 JRST	P$IE$6
	JUMPN	UTIL,P$IE$6
	JUMPE	R12,.+3
	TLNE	FLAG,PATHLR
	 JRST	P$IBAD		; PUT -- SECOND ARGUMENT
	MOVEI	X1,76
	PBOUT
	SKIPN	FLAG20
	 JRST	.+5
	HRRZI	X1,-1
	RFMOD
	TRO	X2,004000
	SFMOD
	TLNE	FLAG,PATHLR
	 HRLZI	X1,160103	; OLD,MSG,CONFIRM,JFN,SHORT
	TLNE	FLAG,PATHRL
	 HRLZI	X1,660043	; OUTPUT,NEW,MSG,CONFIRM,JFN,SHORT
	MOVE	X2,[100,,101]
	GTJFN
	 SETZ	X1,
	MOVE	X4,X1
	SKIPN	FLAG20
	 JRST	.+5
	HRRZI	X1,-1
	RFMOD
	TRZ	X2,006000
	SFMOD
	JUMPE	X4,P$IENR
	MOVEI	X1,100
	BKJFN
	 THUD
	PBIN
	MOVEI	IO,(X1)
	HRRZI	X1,(X4)
	DVCHR
	TLNN	X2,000777
	 JRST	P$IE$1
	HRROI	X1,[ASCIZ/ (Device must be disk.)
/]
	PSOUT
	HRRZI	X1,(X4)
	RLJFN
	 JRST	.+1
	SETO	IO,
	SETZ	UTIL,
	RETURN
P$IE$1:	JUMPN	R12,P$IE$2
	TLNE	FLAG,PATHRL
	 JRST	.+5
	CAIN	IO,33
	 JRST	P$IE$2
	CAIN	IO," "
	 JRST	P$IE$2
	HRROI	X1,UBUF2
	HRRZI	X2,(X4)
	MOVE	X3,[002200,,000001]
	JFNS
	HRRZI	X1,UBUF2
	CALLR	LUTVF
	 JRST	.+2
	JRST	P$IE$2
	HRROI	X1,[ASCIZ/ (Bad remote file name.)
/]
	PSOUT
	HRRZI	X1,(X4)
	RLJFN
	 JRST	.+1
	SETO	IO,
	SETZ	UTIL,
	RETURN
P$IE$2:	MOVE	X1,X4
	MOVEM	X1,LJFN
	HRROI	X1,LFILE
	MOVE	X2,LJFN
	SETZ	X3,
	JFNS
	HLRO	X1,R11
	MOVE	X2,LJFN
	MOVE	X3,[002200,,000001]
	JFNS
	LDB	X2,X1
	CAIE	X2,"."
	 JRST	P$IE$3
	SETZ	X2,
	DPB	X2,X1
P$IE$3:	HRROI	X1,FSBUF
	MOVE	X2,LJFN
	HRLZI	X3,002000
	JFNS
	LDB	X1,[350700,,FSBUF]
	CAIN	X1,"*"
	 SETOM	FSBUF
	HRROI	X1,ESBUF
	HRLZI	X3,000200
	JFNS
	LDB	X1,[350700,,ESBUF]
	CAIN	X1,"*"
	 SETOM	ESBUF
	CAIN	X1,0
	 SETZM	ESBUF
	TLNN	X2,017000
	 JRST	P$IE$4
	TLNE	X2,010000
	 SETOM	VSBUF
	TLNE	X2,007000
	 SETZM	VSBUF
	JRST	P$IE$5
P$IE$4:	HRROI	X1,UBUF1
	HRLZI	X3,000020
	JFNS
	HRROI	X1,UBUF1
	MOVEI	X3,↑D10
	NIN
	 SETZ	X2,
	MOVEM	X2,VSBUF
P$IE$5:	HRRZ	X1,LJFN
	RLJFN
	 THUD
	MOVEI	UTIL,-1(R11)
	CAIN	IO,12
	 SETOM	LJFN
	CAIN	IO,37
	 SETOM	LJFN
	RETURN	SKIP,1
P$IE$6:	JUMPE	R12,.+3
	TLNE	FLAG,PATHLR
	 JRST	.+3
	SETZM	LFILE
	SETZM	LJFN
>
; (((↑↑↑)))
	JUMPN	UTIL,P$IENN
	TLNN	FLAG,PATHAS
	 JRST	P$IENC
	MOVE	R12,[POINT 7,[ASCIZ/**/]]
	TLNN	FLAG,PATHFR
	 JRST	P$IENS
	HRRI	R12,[ASCIZ/*.*/]
	TLNE	FLAG,PATHAV
	 HRRI	R12,[ASCIZ/*.*;*/]
	JRST	P$IENS
P$IENC:	TLNN	FLAG,PATHAD
	 JRST	P$IBAD
	MOVE	R12,[POINT 7,[ASCIZ/<</]]
	TLNE	FLAG,PATHCC
	 HRRI	R12,[ASCIZ/</]
	JRST	P$IENS
P$IENN:	TLNN	FLAG,PATHAS
	 JRST	P$IENZ
	TRNE	R10,P$I$EP!P$I$VP
	 JRST	P$IENZ
	TLNN	FLAG,PATHFR
	 JRST	.+3
	TRNN	R10,P$I$AE!P$I$DE
	 JRST	P$IENZ
	CAIN	IO,12
	 JRST	P$IENZ
	CAIN	IO,37
	 JRST	P$IENZ
	LDB	R13,BP
	CAIN	R13,"<"
	 JRST	P$IENT
	MOVEI	R13,">"
	IDPB	R13,BP
	TBOUT	<R13>
	ADDI	UTIL,1
P$IENT:	MOVE	R12,[POINT 7,[ASCIZ/**/]]
	TLNN	FLAG,PATHFR
	 JRST	P$IENS
	HRRI	R12,[ASCIZ/*.*/]
	TLNE	FLAG,PATHAV
	 HRRI	R12,[ASCIZ/*.*;*/]
P$IENS:	ILDB	R13,R12
	IDPB	R13,BP
	JUMPE	R13,RETN(1)
	TBOUT	<R13>
	AOJA	UTIL,P$IENS
P$IENZ:	SETZ	R13,
	IDPB	R13,BP
	ENDR	SKIP,1

; P$PP -- PROCESS PATH (NODES AND FILES)
;   IN: IO -- SOURCE,,NODE DESTINATION
;	UTIL -- FILE DESTINATION,,EXTENSION DESTINATION
;	FLAG -- PATH CONTEXT FLAGS
;   OUT: FLAG -- FOUND FLAGS
;	 UTIL -- VERSION NUMBER (-1 *) (0 NONE)
;
P$PP:	BEGINR	<BP>
	TLNE	FLAG,PATHNR
	 JRST	P$PN
	HLR	BP,IO
	HRLI	BP,(POINT 7,)
	TLNN	FLAG,PATHNP
	 JRST	P$PF0
	SETZM	(IO)
	MOVE	X1,BP
	MOVE	X2,BP
P$PS1:	ILDB	X3,BP
	CAIN	X3,"<"
	 JRST	P$PS2
	CAIN	X3,">"
	 JRST	P$PS2
	CAIN	X3,"."
	 JRST	P$PS3
	CAIN	X3,";"
	 JRST	P$PS3
	JUMPE	X3,P$PS3
	JRST	P$PS1
P$PS2:	MOVE	X2,BP
	JRST	P$PS1
P$PS3:	MOVE	BP,X2
	CAMN	BP,X1
	 JRST	P$PF
	TLO	FLAG,PATHNF
	MOVE	X1,BP
	LDB	X2,X1
	CAIN	X2,"<"
	 ILDB	X2,X1
	SETZ	X3,
	DPB	X3,X1
	PUSH	STAK,X1
	PUSH	STAK,X2
	CALLR	P$CP
	POP	STAK,X2
	POP	STAK,X1
	DPB	X2,X1
	JRST	P$PF
P$PN:	TLO	FLAG,PATHNF
	CALLR	P$CP
	RETURN
P$PF:	SKIPE	(IO)
	 JRST	P$PF0
	MOVE	X1,[POINT 7,CONTEX]
	MOVE	X2,[POINT 7,NBUF]
	SCOPY	(X1,X2)
P$PF0:	TLO	FLAG,PATHFF
	SETZM	(UTIL)
	HLR	X1,UTIL
	HRLI	X1,(POINT 7,)
P$PF1:	ILDB	X2,BP
; (((TENEX)))
IFG F.TENX,<
	CAIE	X2,"V"-100
	 JRST	.+4
	ILDB	X2,BP
	IDPB	X2,X1
	JRST	P$PF1
>
; (((↑↑↑)))
	IDPB	X2,X1
	JUMPE	X2,P$PF3
	CAIN	X2,";"
	 JRST	P$PF4
	CAIE	X2,"."
	 JRST	P$PF1
	SETZ	X2,
	DPB	X2,X1
	HRRI	X1,(UTIL)
	HRLI	X1,(POINT 7,)
P$PF2:	ILDB	X2,BP
; (((TENEX)))
IFG F.TENX,<
	CAIE	X2,"V"-100
	 JRST	.+4
	ILDB	X2,BP
	IDPB	X2,X1
	JRST	P$PF2
>
; (((↑↑↑)))
	IDPB	X2,X1
	CAIN	X2,";"
	 JRST	P$PF4
	JUMPN	X2,P$PF2
P$PF3:	SETZ	UTIL,
	RETURN
P$PF4:	SETZ	X2,
	DPB	X2,X1
	ILDB	X2,BP
	CAIE	X2,"*"
	 JRST	P$PF5
	SETO	UTIL,
	RETURN
P$PF5:	SETZ	UTIL,
P$PF6:	SUBI	X2,"0"
	IMULI	UTIL,↑D10
	ADDI	UTIL,(X2)
	ILDB	X2,BP
	JUMPN	X2,P$PF6
	ENDR

; CONVERT PATH FROM DFTP FORM TO DATACOMPUTER FORM
;   IN: IO -- SOURCE,,DESTINATION
; 	FLAG -- PATH CONTEXT FLAGS
;
P$CP:	BEGINR	<IO,FLAG>
	MOVEI	X1,<<LBSIZE*5>-1>
	HLR	X2,IO
	HRLI	X2,350700
	HRRI	X3,(IO)
	HRLI	X3,(POINT 7,)
	LDB	IO,X2
	CAIN	IO,"<"
	 JRST	P$CPCX
	TLNE	FLAG,PATHCT
	 JRST	P$CPCT
	TLNE	FLAG,PATHCA
	 JRST	P$CPCA
	JRST	P$CPCC
P$CPCX:	ILDB	IO,X2
	CAIE	IO,"<"
	 JRST	P$CPCC
	ILDB	IO,X2
	CAIE	IO,"<"
	 JRST	P$CPCA
	ILDB	IO,X2
P$CPCT:	MOVE	X4,[POINT 7,[ASCIZ/%TOP./]]
	SCOPY	(X4,X3)
	MOVE	X4,[POINT 7,ANCHOR]
	SCOPY	(X4,X3)
	SUBI	X1,11
	JRST	P$CPCE
P$CPCA:	MOVE	X4,[POINT 7,[ASCIZ/%LOGIN/]]
	SCOPY	(X4,X3)
	SUBI	X1,6
	JRST	P$CPCE
P$CPCC:	MOVE	X4,[POINT 7,CONTEX]
	ILDB	0,X4
	JUMPE	0,.+4
	SOJL	X1,P$CPE
	IDPB	0,X3
	JRST	.-4
	MOVE	X4,X3
	IDPB	0,X4
P$CPCE:	JUMPE	IO,P$CPZ0
	MOVEI	X4,"."
	IDPB	X4,X3
	SUBI	X1,1
	MOVEI	X4,42
	SETZ	FLAG,
	JRST	P$CPI0
P$CPI:	ILDB	IO,X2
P$CPI0:	CAIN	IO,"P"-100
	 JRST	P$CPI
	CAIN	IO,">"
	 JRST	P$CPS
	JUMPE	IO,P$CPZ
	JUMPN	FLAG,P$CPO
	CAIN	IO,":"
	 JRST	P$CPP
	CAIN	IO,"*"
	 JRST	P$CPO
	CAIGE	IO,"A"
	 JRST	P$CPQ
	CAILE	IO,"Z"
	 JRST	P$CPQ
P$CPO:	SOJL	X1,P$CPE
	IDPB	IO,X3
	JRST	P$CPI
P$CPQ:	SOJL	X1,P$CPE
	IDPB	X4,X3
	JRST	P$CPO
P$CPS:	JUMPE	FLAG,.+6
	MOVEI	IO,"'"
	IDPB	IO,X3
	MOVEI	IO,")"
	IDPB	IO,R3
	SETZ	FLAG,
	MOVEI	IO,"."
	JRST	P$CPO
P$CPP:	SUBI	X1,4
	JUMPL	X1,P$CPE
	MOVEI	IO,"("
	IDPB	IO,R3
	MOVEI	IO,"'"
	IDPB	IO,R3
	SETO	FLAG,
	JRST	P$CPI
P$CPE:	TSOUT	<[ASCIZ/ (Pathname too long)/],CRLF>
	MOVE	STAK,[IOWD STSIZ,STBEG]
	JRST	CMDCMD
P$CPZ:	JUMPE	FLAG,.+5
	MOVEI	X1,"'"
	IDPB	X1,X3
	MOVEI	X1,")"
	IDPB	X1,X3
P$CPZ0:	IDPB	IO,X3
	ENDR

; LOCAL FILE NAME PREPARATION
;   IN: IO -- FILE LOCATION,,EXTENSION LOCATION
;
P$LF:	BEGINR	<IO>
; (((TENEX)))
IFG F.TENX,<
	SKIPE	LFILE
	 RETURN
>
; (((↑↑↑)))
	HLL	X1,IO
	HRRI	X1,FSBUF
	BLT	X1,<FSBUF+SBSIZE-1>
	LDB	X1,[350700,,FSBUF]
	CAIN	X1,"*"
	 SETOM	FSBUF
	HRLI	X1,(IO)
	HRRI	X1,ESBUF
	BLT	X1,<ESBUF+SBSIZE-1>
	LDB	X1,[350700,,ESBUF]
	CAIN	X1,"*"
	 SETOM	ESBUF
	CAIN	X1,0
	 SETZM	ESBUF
	HLR	X1,IO
	HRLI	X1,(POINT 7,)
	MOVE	X2,[POINT 7,ABUF]
	ILDB	X3,X1
	IDPB	X3,X2
	JUMPN	X3,.-2
	SKIPN	(IO)
	 JRST	.+8
	MOVEI	X3,"."
	DPB	X3,X2
	HRRI	X1,(IO)
	HRLI	X1,(POINT 7,)
	ILDB	X3,X1
	IDPB	X3,X2
	JUMPN	X3,.-2
; (((TOPS-10+ITS)))
IFLE F.TENX,<
	HRRZI	IO,ABUF
	CALLR	LUTFN
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	MOVEM	UTIL,VSBUF
	JUMPE	UTIL,P$LFX1
	SKIPN	FLAG20
	 MOVEI	X3,";"
	SKIPE	FLAG20
	 MOVEI	X3,"."
	DPB	X3,X2
	JUMPG	UTIL,P$LFX0
	MOVEI	X3,"*"
	IDPB	X3,X2
	SETZ	X3,
	IDPB	X3,X2
	JRST	P$LFX1
P$LFX0:	MOVE	X1,X2
	MOVE	X2,UTIL
	MOVEI	X3,↑D10
	NOUT
	 THUD
P$LFX1:	MOVE	IO,[ABUF,,LFILE]
	BLT	IO,<LFILE+SBSIZE-1>
>
; (((↑↑↑)))
	ENDR

SUBTTL	DATACOMPUTER INTERFACE ROUTINES
PRINTX (Datacomputer interface routines)

; DALO -- ALLOCATE SPACE
;
DALO:	BEGINR
	DCSOUT	<[ASCIZ/MODIFY /],NBUF,<[ASCIZ/,M=/]>>
	MOVE	IO,ABUF
	DCNOUT	<IO>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; DATT -- LOGIN TO NODE
;
DATT:	BEGINR
	DCSOUT	<[ASCIZ/LOGIN /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[ASCII/%LOGI/]
	MOVEM	X1,CONTEX
	MOVE	X1,[ASCII/N/]
	MOVEM	X1,<CONTEX+1>
	SKIPN	OPENED
	 RETURN
	SETZM	OPENED
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; DBIG -- CREATE A <BIG> FILE
;
DBIG:	BEGINR	<IO>
	DCSOUT	<[ASCIZ/LIST /],NBUF,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	DBIG1
	TSOUT	<[ASCIZ/ [Old Node]/],CRLF>
	JRST	DBIG2
DBIG1:	TSOUT	<[ASCIZ/ [New Node]/],CRLF>
	DCSOUT	<[ASCIZ/CREATE /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
DBIG2:	SKIPN	OPENED
	 JRST	DBIG3
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	SETZM	OPENED
DBIG3:	DCSOUT	<[ASCIZ/CREATE /],NBUF,[ASCIZ/."<FILES"> LIKE %TOP.DFTP."<BIG">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,OPENED]
	SCOPY	(X1,X2)
	SETZM	OPENEM
	DCSOUT	<[ASCIZ/"<FILES">="<TERSE">/],SEMI>
	MOVE	IO,[ASCII/.I231/]
	CALLR	RENFIP
	 RETURN
	MOVEI	IO,"Z"-100
	DCBOUT	<IO>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[POINT 7,NBUF]
	MOVE	X2,[POINT 7,CONTEX]
	SCOPY	(X1,X2)
	ENDR

; DCHA -- CHANGE PRIVILEGES (DELETE AND ADD)
;
DCHA:	BEGINR	<IO,UTIL>
	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIV/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
DCHAD:	DCSOUT	<[ASCIZ/DELETEP /],NBUF,<[ASCIZ/,N=1/]>,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+2
	JRST	DCHAD
	TSOUT	<[ASCIZ/ [OK]/],CRLF>
DCHAI:	TAIN	<[ASCIZ/ Add a new privilege? /]>
	 RETURN
	 RETURN
	SETZM	ABUF		; WRITE FLAG
	SETZM	<ABUF+1>	; HOST
	SETZM	<ABUF+2>	; SOCKET
	SETOM	<ABUF+3>	; PASSWORD
	TAIN	<[ASCIZ/  Allow control? /]>
	 JRST	DCHAI
	 SETOM	ABUF
	TAIN	<[ASCIZ/  Restrict via network? /]>
	 JRST	DCHAI
	 JRST	DCHAI5
	TAIN	<[ASCIZ/   Restrict via local host? /]>
	 JRST	DCHAI
	 JRST	DCHAI1
	MOVE	IO,LHOST
	JRST	DCHAI2
DCHAI1:	TSOUT	<[ASCIZ/    Host number (octal): /]>
	TNIN	([ASCIZ/    Host number (octal): /],10)
	 JRST	DCHAI
	TSOUT	<CRLF>
DCHAI2:	MOVEM	IO,<ABUF+1>
	TAIN	<[ASCIZ/   Restrict via user? /]>
	 JRST	DCHAI
	 JRST	DCHAI5
	MOVE	IO,LHOST
	CAMN	IO,<ABUF+1>
	 JRST	DCHAI3
	TSOUT	<[ASCIZ/    Socket number (octal): /]>
	TNIN	([ASCIZ/    Socket number (octal): /],10)
	 JRST	DCHAI
	JRST	DCHAI4
DCHAI3:
; (((NOT ITS)))
IFGE F.TENX,<
; (((TOPS-10)))
IFE F.TENX,<
; (((NOT SAIL)
IFE F.SAIL,<
	TSOUT	<[ASCIZ/    User: /]>
	TNIN	([ASCIZ/    User: /],10)
	 JRST	DCHAI
	LSH	IO,11
	ADDI	IO,100
>
; (((↑↑↑)))
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	TSOUT	<[ASCIZ/    User: /]>
	TSIN	(UBUF1,LBSIZE,[ASCIZ/    User: /])
	 JRST	DCHAI
	SETZ	X1,
	MOVE	X2,[POINT 7,UBUF1]
	STDIR
	 JRST	.+3
	 JRST	.+2
	JRST	.+4
	HRROI	X1,[ASCIZ/ (User not found)
/]
	PSOUT
	JRST	DCHAI
	HRRZI	IO,(X1)
	LSH	IO,↑D15
	ADDI	IO,20
>
; (((↑↑↑)))
>
; (((↑↑↑)))
IFL F.TENX,<SETZM ABUF+2
	JRST DCHAI5>
IFN F.SAIL,<SETZM <ABUF+2>
	JRST DCHAI5>
DCHAI4:	MOVEM	IO,<ABUF+2>
	TSOUT	<CRLF>
DCHAI5:	TAIN	<[ASCIZ/  Restrict via password? /]>
	 JRST	DCHAI
	 JRST	DCHAC
	TSOUT	<[ASCIZ/   Password: /]>
	TSIN	(<ABUF+3>,<SBSIZE-3>,[ASCIZ/   Password: /])
	 JRST	DCHAI
	TSOUT	<CRLF>
DCHAC:	DCSOUT	<[ASCIZ/CREATEP /],NBUF,<[ASCIZ/,U=**,G=LR/]>>
	SKIPE	ABUF
	 JRST	DCHAC1
	DCSOUT	<[ASCIZ/CWA/]>
DCHAC1:	SKIPN	<ABUF+1>
	 JRST	DCHAC3
	DCSOUT	<<[ASCIZ/,H=/]>>
	MOVE	IO,<ABUF+1>
	DCNOUT	<IO>
	DCSOUT	<<[ASCIZ/,S=/]>>
	MOVE	IO,<ABUF+2>
	JUMPE	IO,DCHAC2
	DCNOUT	<IO>
	JRST	DCHAC3
DCHAC2:	DCSOUT	<[ASCIZ/ANY/]>
DCHAC3:	SETO	IO,
	CAMN	IO,<ABUF+3>
	 JRST	DCHAC4
	DCSOUT	<<[ASCIZ/,P='/]>,<ABUF+3>,[ASCIZ/'/]>
DCHAC4:	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	TSOUT	<[ASCIZ/  [OK]/],CRLF>
	JRST	DCHAI
	ENDR

; DCON -- CONNECT (VERIFY CONTEXT)
;
DCON:	BEGINR
	DCSOUT	<[ASCIZ/LIST /],NBUF,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	DCON1
	TSOUT	<[ASCIZ/ [Old Node]/],CRLF>
	JRST	DCON2
DCON1:	TAIN	<[ASCIZ/ [New Node][Confirm]/]>
	 RETURN
	 RETURN
	DCSOUT	<[ASCIZ/CREATE /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
DCON2:	MOVE	X1,[POINT 7,NBUF]
	MOVE	X2,[POINT 7,CONTEX]
	SCOPY	(X1,X2)
	ENDR

; DCRE -- CREATE NEW NODE
;
DCRE:	BEGINR
	DCSOUT	<[ASCIZ/CREATE /],NBUF,<[ASCIZ/,M=/]>>
	MOVEI	IO,DEFALO
	DCNOUT	<IO>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	CALLR	DCHA
	ENDR

; DDEL -- DELETE FILES
;
DDEL:	BEGINR	<IO>
	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	SETO	IO,
	CALLR	D$VER
	 RETURN
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE DELETED INTEGER
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DELETED=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	UPDATE FILES IN "<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT <[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		STATUS='D'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		DELETED=DELETED+1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT FILES.FILE.HEADER.FILENAME
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		  ! '.' ! FILES.FILE.HEADER.EXTENSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		    ! ';' ! FILES.FILE.HEADER.VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF DELETED EQ 0 THEN ERROR 'NO SUCH FILE'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END;
/]>
	CALLR	RENDER
	 RETURN
	ENDR

; DDIR -- FILE DIRECTORY
;   IN:  FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DDIR:	BEGINR	<IO,UTIL>
; (((TENEX)))
IFG F.TENX,<
	SETZM	FLAGCO
>
; (((↑↑↑)))
	SETO	IO,
	CALLR	D$OPEN
	 RETURN
	SKIPN	VBUF
	 SETOM	VBUF
	SETZ	UTIL,
	CAIN	FLAG,DD$D
	 JRST	DDIRO1
	CAIN	FLAG,DD$T
	 JRST	DDIRO2
	CAIN	FLAG,DD$V
	 JRST	DDIRO3
	RETURN
DDIRO1:	DCSOUT	<[ASCIZ/"<TERSE">="<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ 'D'/]
	JRST	DDIRO4
DDIRO2:	DCSOUT	<[ASCIZ/"<TERSE">="<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	JRST	DDIRO4
DDIRO3:	DCSOUT	<[ASCIZ/"<VERBOSE">="<FILES">/]>
	SETZ	IO,
DDIRO4:	CALLR	D$WITH
	DCSOUT	<SEMI>
	MOVE	IO,[ASCII/.I241/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
; (((TOPS-10+ITS)))
IFLE F.TENX,<
DDIRF:	CALLR	RENPRE
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
DDIRF:	SKIPN	FLAGCO
	 JRST	DDIRF0
	HRROI	X1,[ASCIZ/ [Aborting]
/]
	PSOUT
	MOVE	X1,DCOJFN
	MOVEI	X2,22
	MTOPR
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DDIRF0:	CALLR	RENPRE
>
; (((↑↑↑)))
	CAMN	IO,[ASCII/     /]
	 JRST	DDIRF1
	CAMN	IO,[ASCII/.I261/]
	 JRST	DDIRF2
	CALLR	RENLIP
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DDIRF1:	CALLR	<(FLAG)>
	AOJA	UTIL,DDIRF
DDIRF2:	CALLR	RENLIN
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	JUMPN	UTIL,RETN(0)
	TSOUT	<[ASCIZ/ [No Files]/],CRLF>
	ENDR

; DD$D -- DELETED FILES
;
DD$D:	BEGINR
	CALLR	DD$T
	ENDR

; DD$T -- TERSE FILES
;
DD$T:	BEGINR	<IO>
	SKIPE	FLAGDD
	 JRST	DD$T1
	MOVEI	IO,11
	TBOUT	<IO>
DD$T1:	DCBIN	<IO>
	SKIPE	FLAGDD
	 JRST	DD$T2
	TBOUT	<IO>
DD$T2:	CAIE	IO,12
	 JRST	DD$T1
	ENDR

; DD$V -- VERBOSE FILES
;
DD$V:	BEGINR	<IO>
	SKIPE	FLAGDD
	 JRST	DD$V1
	MOVEI	IO,11
	TBOUT	<IO>
DD$V1:	DCBIN	<IO>
	SKIPE	FLAGDD
	 JRST	DD$V3
	CAIN	IO,11
	 JRST	DD$V2
	TBOUT	<IO>
	JRST	DD$V3
DD$V2:	TSOUT	<CRLF>
	TBOUT	<IO>
	TBOUT	<IO>
	JRST	DD$V1
DD$V3:	CAIE	IO,12
	 JRST	DD$V1
	ENDR

; DEXA -- EXAMINE (LIST FILES TO TERMINAL)
;
DEXA:	BEGINR	<IO,FLAG>
; (((TENEX)))
IFG F.TENX,<
	GJINF
	CAME	X2,LDIR
	 CALLR	D$CON
>
; (((↑↑↑)))
	SETZ	FLAG,
	SETO	IO,
	CALLR	D$OPEN
	 RETURN
	SKIPLE	VBUF
	 JRST	DEXA1
	MOVEI	IO," "
	CALLR	D$VER
	 RETURN
	JRST	DEXA2
DEXA1:	CALLR	D$VEX
	 RETURN
DEXA2:	DCSOUT	<[ASCIZ/"<GET">="<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT	<SEMI>
	CALLR	NETOI
	 THUD
	MOVE	IO,[ASCII/;I249/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
	SETZM	NSUM
IFN F.TENX!F.SAIL,< SETZM FLAGSM >
DEXA3:	SETZM	DEXA$L
	CALLR	EXAFIL
	 JRST	DEXA4		; EXIT RETRIEVAL LOOP ON NETWORK EOF
	MOVNI	IO,10
	CAMN	IO,DEXA$L
	 AOJA	FLAG,DEXA4
	SKIPE	FLAGTT
	 CALLR	NETRAT
	AOJA	FLAG,DEXA3
DEXA4:	CALLR	NETC
	MOVE	IO,[ASCII/;I269/]
	CALLR	RENFIP
	 JRST	DEXAE
	CALLR	RENLIN
	CALLR	NETSUM
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	JUMPN	FLAG,RETN(1)
	TSOUT	<[ASCIZ/ (No Such File)/],CRLF>
	RETURN	SKIP,1
DEXAE:	CALLR	D$CON
	ENDR
; EXAMINE -- TERMINAL OUTPUT
;   IN: IO -- COUNT OF CHARACTERS IN BUFFER
;	BP -- BYTE POINTER INTO BUFFER
DEXA$:	BEGINR	<UTIL,FLAG>
	SKIPGE	DEXA$L
	 RETURN
	SETZ	FLAG,
DEXA$1:	SKIPG	IO
	 RETURN
	ILDB	UTIL,BP
	CAIGE	UTIL," "
	 JRST	DEXA$3
DEXA$2:	TBOUT	<UTIL>
	SOJA	IO,DEXA$1
DEXA$3:	CAIN	UTIL,15
	 JRST	DEXA$2
	CAIN	UTIL,11
	 JRST	DEXA$2
	CAIN	UTIL,12
	 JRST	DEXA$4
	CAIN	UTIL,37
	 JRST	DEXA$4
	CAIG	IO,5
	 JUMPE	UTIL,RETN(0)
	PUSH	STAK,UTIL
	MOVEI	UTIL,"↑"
	TBOUT	<UTIL>
	POP	STAK,UTIL
	ADDI	UTIL,100
	TBOUT	<UTIL>
	ADDI	FLAG,1
	CAIE	FLAG,20
	 SOJA	IO,DEXA$1
	JRST	DEXA$5
DEXA$4:	AOS	X1,DEXA$L
	CAMGE	X1,DEXA$P
	 JRST	DEXA$2
	CAIG	IO,5
	 JRST	DEXA$2
	SUBI	IO,1
	SETZM	DEXA$L
DEXA$5:	SETZ	FLAG,
	TSOUT	<CRLF,[ASCIZ/ More? /]>
DEXA$6:	TBIN	<UTIL>
	CAIN	UTIL,15
	 JRST	DEXA$6
	CAIN	UTIL,"Y"
	 JRST	DEXA$7
	CAIN	UTIL,12
	 JRST	DEXA$7
	CAIN	UTIL,33
	 JRST	DEXA$7
	CAIN	UTIL,37
	 JRST	DEXA$7
	CAIN	UTIL," "
	 JRST	DEXA$7
	CAIN	UTIL,"A"
	 JRST	DEXA$8
	JRST	DEXA$9
DEXA$7:	TSOUT	<[ASCIZ/Yes/],CRLF>
	JRST	DEXA$1
DEXA$8:	TSOUT	<[ASCIZ/Abort/],CRLF>
	MOVNI	X1,10
	MOVEM	X1,DEXA$L
	RETURN
DEXA$9:	TSOUT	<[ASCIZ/No/],CRLF>
	SETOM	DEXA$L
	ENDR

; DEXP -- EXPUNGE
;
DEXP:	BEGINR	<IO>
	SKIPN	OPENED
	 JRST	DEXP1
	SETZM	OPENED
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
DEXP1:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES"> %INFORMATION/],SEMI>
	CALLR	RENPRE
	CALLR	RENLIN
	CAMN	IO,[ASCII/.I280/]
	 JRST	DEXP2
	TSOUT	<[ASCIZ/ (There are no <FILES>)/],CRLF>
	RETURN
DEXP2:	DCBIN	<IO>
	CAIN	IO," "
	 JRST	DEXP3
	CAIE	IO,12
	 JRST	DEXP2
	DCBIN	<IO>
	CAIN	IO," "
	 JRST	DEXP3
	CALLR	RENLIN
	RETURN
DEXP3:	DCBIN	<IO>
	CAIE	IO,"R"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"E"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"C"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"S"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"="
	 JRST	DEXP2
	CALLR	DCNIN
	CALLR	RENLIN
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	JUMPN	IO,DEXP4
	DCSOUT	<[ASCIZ/DELETE /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DEXP4:	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	DCSOUT	<[ASCIZ/OPEN /],NBUF,<[ASCIZ/."<FILES">,SYN="<">/]>,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/"<FILES">="<"> WITH STATUS EQ ' '/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<[ASCIZ/CLOSE "<">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	SETZM	OPENED
	ENDR

; DGET -- GET-RETRIEVE
;
DGET:	BEGINR	<IO,FLAG>
; (((TENEX)))
IFG F.TENX,<
	GJINF
	CAME	X2,LDIR
	 CALLR	D$CON
>
; (((↑↑↑)))
	SETZ	FLAG,
	SETO	IO,
	CALLR	D$OPEN
	 RETURN
	SKIPLE	VBUF
	 JRST	DGET1
	MOVEI	IO," "
	CALLR	D$VER
	 RETURN
	JRST	DGET2
DGET1:	CALLR	D$VEX
	 RETURN
DGET2:	DCSOUT	<[ASCIZ/"<GET">="<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT	<SEMI>
	CALLR	NETOI
	 THUD
	MOVE	IO,[ASCII/;I249/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
	SKIPE	FLAGNN
	 JRST	DGET$
	TSOUT	<[ASCIZ/ [OK]/],CRLF>
DGET$:	SETZM	NSUM
IFN F.TENX!F.SAIL,< SETZM FLAGSM >
DGET3:	CALLR	GETFIL
	 JRST	DGET4		; EXIT RETRIEVAL LOOP ON NETWORK EOF
	CALLR	LOCNFO
	SETZM	FLAGFE
	CALLR	LOCOO
	 SETOM	FLAGFE
	CALLR	GETDAT
	CALLR	LOCC
	SKIPE	FLAGTT
	 CALLR	NETRAT
	AOJA	FLAG,DGET3
DGET4:	CALLR	NETC
	MOVE	IO,[ASCII/;I269/]
	CALLR	RENFIP
	 JRST	DGETE
	CALLR	RENLIN
	CALLR	NETSUM
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	JUMPN	FLAG,RETN(1)
	TSOUT	<[ASCIZ/ (No Such File)/],CRLF>
	RETURN	SKIP,1
DGETE:	CALLR	D$CON
	ENDR
; FIELD LENGTHS IN WORDS FROM <GET>
	GET$F==SBSIZE		; FILENAME
	GET$E==SBSIZE		; EXTENSION
	GET$D==4		; DATE

; DLIN -- DATACOMPUTER LINK
;
DLIN:	BEGINR	<IO,UTIL,FLAG>
	MOVE	FLAG,FLAGDD
DLINI:	TSOUT	(<[BYTE (7)76,0,0,0,0]>)
	TSIN	(ABUF,SBSIZE,<[BYTE (7)76,0,0,0,0]>)
	 JRST	DLINI
	JUMPE	UTIL,DLINE
	TSOUT	<CRLF>
	SETZM	FLAGDD
	DCSOUT	<ABUF,CRLF>
	SETOM	FLAGDD
	CALLR	RENDER
	 JRST	DLINI
	JRST	DLINI
DLINE:	TSOUT	<[ASCIZ/[Returning]/],CRLF>
	MOVEM	FLAG,FLAGDD
	ENDR

; DLIS -- NODE DIRECTORY
;   IN:  FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DLIS:	BEGINR	<IO,UTIL>
; (((TENEX)))
IFG F.TENX,<
	SETZM	FLAGCO
>
; (((↑↑↑)))
	CAIN	FLAG,DL$T
	 JRST	DLISO1
	CAIN	FLAG,DL$V
	 JRST	DLISO2
	CAIN	FLAG,DL$P
	 JRST	DLISO3
	RETURN
DLISO1:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %NAME/],SEMI>
	JRST	DLISI
DLISO2:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %INFORMATION/],SEMI>
	JRST	DLISI
DLISO3:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIVILEGE/],SEMI>
DLISI:	SETZ	UTIL,
	SETZM	GBUF1
	MOVE	X1,[GBUF1,,GBUF1+1]
	BLT	X1,<GBUF1+LBSIZE-1>
	MOVEI	X1,<GBUF2+1>
	MOVEM	X1,GBUF2
	CALLR	RENPRE
	CAMN	IO,[ASCII/.I280/]
	 JRST	DLISD
	CALLR	RENLIP
	JRST	DLISER
; (((TOPS-10+ITS)))
IFLE F.TENX,<
DLISN:	DCBIN	<IO>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
DLISN:	SKIPN	FLAGCO
	 JRST	DLISN0
	HRROI	X1,[ASCIZ/ [Aborting]
/]
	PSOUT
	MOVE	X1,DCOJFN
	MOVEI	X2,22
	MTOPR
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<SEMI>
	JRST	DLISER
DLISN0:	DCBIN	<IO>
>
; (((↑↑↑)))
	CAIE	IO," "
	 JRST	DLISE
	SETO	UTIL,
	SKIPE	FLAGDD
	 JRST	DLISD
	CALLR	<(FLAG)>
	JRST	DLISN
DLISD:	CALLR	RENLIN
	JRST	DLISN
DLISE:	CAIN	IO,"?"
	 JRST	DEATH
	CALLR	RENLIN
	JUMPN	UTIL,DLISER
	TSOUT	<[ASCIZ/ [No Nodes]/],CRLF>
DLISER:	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; DL$T -- TERSE NODES
;
DL$T:	BEGINR
	CALLR	DL$NAM
	 JRST	DL$T0
	TSOUT	<CRLF>
DL$T0:	CALLR	RENLIN
	ENDR

; DL$V -- VERBOSE NODES
;
DL$V:	BEGINR	<IO,UTIL,FLAG>
DL$VN:	DCBIN	<IO>
	CAIE	IO,"="
	 JRST	DL$VN
	CALLR	DL$NAM
	 JRST	DL$VE
	TSOUT	<CRLF>
	MOVEI	UTIL,GBUF1
	SKIPE	(UTIL)
	 AOJA	UTIL,.-1
	SUBI	UTIL,GBUF1
DL$VF:	DCBIN	<IO>
	CAIE	IO,"="
	 JRST	DL$VF
	DCBIN	<IO>
	SETZ	FLAG,
	CAIN	IO,"F"
	 MOVEI	FLAG,5
	CAIN	IO,"P"
	 MOVEI	FLAG,1
	CAIN	IO,"N"
	 MOVEI	FLAG,3
	JUMPE	FLAG,DL$VE
	CALLR	RENLIN
DL$VD:	MOVEI	IO,(UTIL)
DL$VD0:	TSOUT	<[ASCIZ/    /]>
	SOJGE	IO,DL$VD0
	MOVEI	IO,"]"
	TBOUT	<IO>
DL$VD1:	DCBIN	<IO>
	TBOUT	<IO>
	CAIE	IO,12
	 JRST	DL$VD1
	SOJG	FLAG,DL$VD
	RETURN
DL$VE:	CALLR	RENLIN
	ENDR

; DL$P -- PROTECTION
;
DL$P:	BEGINR	<IO>
	CALLR	DL$NAM
	 JRST	DL$P1
	TSOUT	<CRLF>
	CALLR	RENLIN
	RETURN
DL$P1:	MOVEI	IO,GBUF1
DL$P2:	SKIPE	(IO)
	 AOJA	IO,DL$P2
	SUBI	IO,GBUF1
DL$P3:	TSOUT	<[ASCIZ/    /]>
	SOJGE	IO,DL$P3
	MOVEI	IO,"]"
	TBOUT	<IO>
DL$P4:	DCBIN	<IO>
	TBOUT	<IO>
	CAIE	IO,12
	 JRST	DL$P4
	ENDR

; DL$NAM -- DIRECTORY: NAME OUTPUT
;   OUT: IO -- LAST CHARACTER INPUT
;
DL$NAM:	BEGINR	<BP,UTIL,FLAG,R10>
	SETZ	R10,
	SETZ	FLAG,
	MOVE	BP,[POINT 7,ABUF]
	MOVEI	UTIL,<SBSIZE*5>
	DCBIN	<IO>
	CAILE	IO," "
	 JRST	DL$NA1
	RETURN
DL$NAN:	DCBIN	<IO>
DL$NA1:	CAIN	IO,"."
	 JRST	DL$NIN
	CAIG	IO," "
	 JRST	DL$NA3
	CAIE	IO,42
	 JRST	DL$NA2
	DCBIN	<IO>
DL$NA2:	IDPB	IO,BP
	SOJG	UTIL,DL$NAN
	JRST	DL$NER
DL$NA3:	SETZ	X1,
	IDPB	X1,BP
	TSOUT	<[ASCIZ/  /],ABUF>
	RETURN	SKIP,1
DL$NIN:	MOVE	BP,[POINT 7,ABUF]
	MOVEI	UTIL,<SBSIZE*5>
DL$NI1:	DCBIN	<IO>
	CAIN	IO,"."
	 JRST	DL$NCN
	CAIG	IO," "
	 JRST	DL$NCN
DL$NI2:	CAIE	IO,42
	 JRST	DL$NI3
	DCBIN	<IO>
DL$NI3:	IDPB	IO,BP
	SOJG	UTIL,DL$NI1
	JRST	DL$NER
DL$NCN:	SETZ	X1,
	IDPB	X1,BP
	SKIPN	X2,GBUF1(FLAG)
	 JRST	DL$NON
	HRLI	X2,(POINT 7,)
	MOVE	X1,[POINT 7,ABUF]
DL$NC1:	ILDB	X3,X1
	ILDB	X4,X2
	CAIE	X3,(X4)
	 JRST	DL$NON
	JUMPN	X3,DL$NC1
	CAIG	IO," "
	 RETURN	SKIP,1
	AOJA	FLAG,DL$NIN
DL$NON:	CAIL	FLAG,LBSIZE-2
	 JRST	DL$NER
	SETZM	GBUF1+1(FLAG)
	HRL	X1,GBUF1+1(FLAG)
	HRR	X1,GBUF1+2(FLAG)
	BLT	X1,<GBUF1+LBSIZE-1>
	MOVE	X1,[POINT 7,ABUF]
	SKIPN	X2,GBUF1(FLAG)
	 HRR	X2,GBUF2
	HRLI	X2,(POINT 7,)
	HRRZI	BP,(BP)
	SUBI	BP,<ABUF-1>
	ADDI	BP,(X2)
	CAIL	BP,<GBUF2+LBSIZE>
	 JRST	DL$NER
	HRRZM	X2,GBUF1(FLAG)
DL$NO1:	ILDB	X3,X1
	IDPB	X3,X2
	JUMPN	X3,DL$NO1
	HRRZI	X2,1(X2)
	MOVEM	X2,GBUF2
	MOVEI	UTIL,(FLAG)
	JUMPE	R10,DL$NO2
	TSOUT	<CRLF>
DL$NO2:	TSOUT	<[ASCIZ/    /]>
	SOJGE	UTIL,DL$NO2
	TSOUT	<ABUF>
	SETO	R10,
	CAIG	IO," "
	 RETURN	SKIP,1
	AOJA	FLAG,DL$NIN
DL$NER:	TSOUT	<[ASCIZ/ (Pathname too long)/],CRLF>
	ENDR

; DPUT -- PUT-STORE
;
DPUT:	BEGINR	<IO>
; (((TENEX)))
IFG F.TENX,<
	GJINF
	CAME	X2,LDIR
	 CALLR	D$CON
>
; (((↑↑↑)))
	CALLR	LOCFFI
	 RETURN
	SKIPN	OPENED
	 JRST	DPUT3
	MOVE	X1,[440700,,OPENED]
	MOVE	X2,[440700,,NBUF]
DPUT1:	ILDB	X3,X1
	ILDB	X4,X2
	CAIE	X3,(X4)
	 JRST	DPUT2
	JUMPN	X3,DPUT1
	MOVEI	X1,1
	CAMN	X1,OPENEM
	 JRST	DPUT5
	DCSOUT	<[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVEI	X1,1
	MOVEM	X1,OPENEM
	JRST	DPUT5
DPUT2:	SETZM	OPENED
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
DPUT3:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	DPUT4
	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,OPENED]
	SCOPY	(X1,X2)
	MOVEI	X1,1
	MOVEM	X1,OPENEM
	JRST	DPUT5
DPUT4:	DCSOUT	<[ASCIZ/CREATE /],NBUF,[ASCIZ/."<FILES"> LIKE %TOP.DFTP."<FILE">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	SKIPE	FLAGNN
	 JRST	DPUT$1
	TSOUT	<[ASCIZ/ [New <FILES>]/],CRLF>
DPUT$1:	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,OPENED]
	SCOPY	(X1,X2)
	SETZM	OPENEM
	DCSOUT	<[ASCIZ/"<FILES">="<TERSE">/],SEMI>
	MOVE	IO,[ASCII/.I231/]
	CALLR	RENFIP
	 RETURN
	MOVEI	IO,"Z"-100
	DCBOUT	<IO>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVEI	X1,1
	MOVEM	X1,OPENEM
	SETZM	VBUF
	JRST	DPUT6
DPUT5:	SETZM	VBUF
	SETZ	IO,
	CALLR	D$VER
	 RETURN
DPUT6:	AOS	VBUF
	DCSOUT	<[ASCIZ/"<FILES">="<PUT">/],SEMI>
	CALLR	NETOO
	 THUD
	MOVE	IO,[ASCII/;I239/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
	SKIPE	FLAGNN
	 JRST	DPUT$2
	TSOUT	<[ASCIZ/ [OK]/],CRLF>
DPUT$2:	SETZM	NSUM
IFN F.TENX!F.SAIL,< SETZM FLAGSM >
	CALLR	LOCOI
	 THUD
	CALLR	NETFFI
DPUT7:	CALLR	PUTFIL
	CALLR	PUTDAT
	SKIPE	FLAGTT
	 CALLR	NETRAT
	CALLR	LOCNFI
	 JRST	DPUT7
	CALLR	NETC
	MOVE	IO,[ASCII/;I259/]
	CALLR	RENFIP
	 JRST	DPUTE
	CALLR	RENLIN
	CALLR	NETSUM
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN	SKIP,1
DPUTE:	CALLR	D$CON
	ENDR

; DREM -- DELETE NODES
;
DREM:	BEGINR
	SKIPN	OPENED
	 JRST	DREM0
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	SETZM	OPENED
DREM0:	DCSOUT	<[ASCIZ/DELETE /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<[ASCIZ/LIST /],CONTEX,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+2
	RETURN
	TSOUT	<[ASCIZ/ [Connected To Attached Node]/],CRLF>
	MOVE	X1,[ASCII/%LOGI/]
	MOVEM	X1,CONTEX
	MOVE	X1,[ASCII/N/]
	MOVEM	X1,<CONTEX+1>
	ENDR

; DREN -- RENUMBER FILES
;
DREN:	BEGINR	<IO,UTIL>
	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	SETO	IO,
	CALLR	D$VER
	 RETURN
	MOVE	UTIL,VBUF
	MOVE	IO,ABUF
	MOVEM	IO,VBUF
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ DECLARE SAMEVERSION INTEGER/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ SAMEVERSION=0/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ FOR FILES IN "<FILES">/]>
	SETZ	IO,
	CALLR	D$WITH
	DCSOUT	<CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  SAMEVERSION=SAMEVERSION+1/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ IF SAMEVERSION NE 0 THEN ERROR 'VERSION ALREADY EXISTS'/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	CALLR	RENDER
	 RETURN
	MOVEM	UTIL,VBUF
	DCSOUT	<[ASCIZ/BEGIN/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ DECLARE RENUMBERED INTEGER/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ RENUMBERED=0/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ UPDATE FILES IN "<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT	<CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ BEGIN/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  COMMENT FILES.FILE.HEADER.FILENAME/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/   ! '.' ! FILES.FILE.HEADER.EXTENSION/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/    ! ';' ! FILES.FILE.HEADER.VERSION/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  VERSION=/]>
	MOVE	IO,ABUF
	DCNOUT	<IO>
	DCSOUT	<CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  RENUMBERED=RENUMBERED+1/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ END/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ IF RENUMBERED EQ 0 THEN ERROR 'NO SUCH FILE'/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	CALLR	RENDER
	 RETURN
	ENDR

; DUND -- UNDELETE
;
DUND:	BEGINR	<IO>
	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	MOVEI	IO,"D"
	CALLR	D$VER
	 RETURN
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE UNDELETED INTEGER
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	UNDELETED=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	UPDATE FILES IN "<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ 'D'/]
	CALLR	D$WITH
	DCSOUT <[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		STATUS=' '
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		UNDELETED=UNDELETED+1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT FILES.FILE.HEADER.FILENAME
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		  ! '.' ! FILES.FILE.HEADER.EXTENSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		    ! ';' ! FILES.FILE.HEADER.VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF UNDELETED EQ 0 THEN ERROR 'NO SUCH FILE'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END;
/]>
	CALLR	RENDER
	 RETURN
	ENDR

; D$INIT -- INITIALIZE DATACOMPUTER SESSION
;
D$INIT:	BEGINR	<IO,BP,UTIL,FLAG>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+2
	JRST	D$IN0
	TSOUT	<[ASCIZ/ ?? Datacomputer initialization failure ??/],CRLF>
	JRST	QUIT
D$IN0:	TSOUT	<[ASCIZ/ [Attaching]/],CRLF>
	HRRZI	UTIL,HOSTS
D$IN1:	SKIPN	(UTIL)
	 JRST	D$IND
	HLRZ	X1,(UTIL)
	CAME	X1,LHOST
	 AOJA	UTIL,D$IN1
	MOVE	IO,[POINT 7,[ASCIZ/%TOP.DFTP./]]
	MOVE	BP,[POINT 7,ABUF]
	SCOPY	(IO,BP)
	HRR	IO,(UTIL)
	HRLI	IO,(POINT 7,)
	SCOPY	(IO,BP)
	MOVEI	IO,"."
	IDPB	IO,BP
; (((ITS)))
IFL F.TENX,<
	.SUSET [.RXUNAME,,UBUF1]
	SETZM UBUF1+1
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; (((NOT SAIL)))
IFE F.SAIL,<
	HRROI X1,31
	HRROI X2,32
	GETTAB	X1,
	 THUD
	GETTAB	X2,
	 THUD
	MOVEM	X1,UBUF1
	MOVEM	X2,<UBUF1+1>
	SETZM	<UBUF1+2>
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
	GETPPN X1,
	 JFCL
	TRNN X1,770000
	 JRST [	LSH X1,↑D6
		JRST .-1]		; Left Justify SAIL PN's
	HRLZM X1,UBUF1
	SETZM UBUF1+1
>
; (((↑↑↑)))
>
; (((↑↑↑)))
; (((ITS+TOPS-10)
IFLE F.TENX,<
	MOVE	X1,[POINT 6,UBUF1]
	MOVEI	X2,42
	ILDB	X3,X1
	JUMPE	X3,.+7
	ADDI	X3,40
	CAIL	X3,"A"
	 CAILE	X3,"Z"
	  IDPB	X2,BP
	IDPB	X3,BP
	JRST	.-7
	MOVE	X1,BP
	IDPB	X3,X1
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	GJINF
	CAMN	X1,X2
	 JRST	.+10
	HRROI	X1,[ASCIZ/  (from /]
	PSOUT
	MOVEI	X1,101
	DIRST
	 THUD
	HRROI	X1,[ASCIZ/)
/]
	PSOUT
	HRROI	X1,UBUF1
	DIRST
	 THUD
	MOVE	X1,[POINT 7,UBUF1]
	MOVEI	X2,42
	ILDB	X3,X1
	JUMPE	X3,.+6
	CAIL	X3,"A"
	 CAILE	X3,"Z"
	  IDPB	X2,BP
	IDPB	X3,BP
	JRST	.-6
	MOVE	X1,BP
	IDPB	X3,X1
>
; (((↑↑↑)))
	DCSOUT	<[ASCIZ/LOGIN /],ABUF,SEMI>
	CALLR	RENPRE
	CALLR	RENLIN
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	CAMN	IO,[ASCII/;O032/]
	 JRST	D$INP
	CAME	IO,[ASCII/+U107/]
	 JRST	D$IND
	MOVEI	FLAG,3
D$IN2:	TSOUT	<[ASCIZ/  [Password:/]>
	TSIN	(UBUF1,LBSIZE,<[ASCIZ/  [Password:/]>,NOECHO)
	 JRST	D$IN2
	TSOUT	<[ASCIZ/]/],CRLF>
	MOVE	X2,BP
	MOVEI	X1,"("
	IDPB	X1,X2
	MOVEI	X1,"'"
	IDPB	X1,X2
	MOVE	X1,[440700,,UBUF1]
	SCOPY	(X1,X2)
	MOVEI	X1,"'"
	IDPB	X1,X2
	MOVEI	X1,")"
	IDPB	X1,X2
	SETZ	X1,
	IDPB	X1,X2
	DCSOUT	<[ASCIZ/LOGIN /],ABUF,SEMI>
	CALLR	RENDER
	 JRST	.+2
	JRST	D$INP
	TSOUT	<[ASCIZ/   (Incorrect password)/],CRLF>
	SOJG	FLAG,D$IN2
	TSOUT	<[ASCIZ/ [Attaching]/],CRLF>
D$IND:	MOVE	X1,[POINT 7,[ASCIZ/%TOP.DFTP.DFTP.GUEST/]]
	MOVE	X2,[POINT 7,ABUF]
	SCOPY	(X1,X2)
	DCSOUT	<[ASCIZ/LOGIN %TOP.DFTP.DFTP.GUEST/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	TSOUT	<[ASCIZ/  (as DFTP.GUEST)/],CRLF>
D$INP:	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<GET"> READ/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<PUT"> WRITE/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<TERSE"> WRITE/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<VERBOSE"> READ/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	MOVE	UTIL,[ASCII/%LOGI/]
	MOVEM	UTIL,CONTEX
	MOVE	UTIL,[ASCII/N/]
	MOVEM	UTIL,<CONTEX+1>
	SETZM	OPENED
	CALLR	D$CON
	ENDR

; D$CON -- CONNECT
;
D$CON:	BEGINR	<UTIL>
	CALLR	NETDSI
	DCSOUT	<[ASCIZ/CONNECT "<GET"> /]>
	DCNOUT	<UTIL>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	CALLR	NETDSO
	DCSOUT	<[ASCIZ/CONNECT "<PUT"> /]>
	DCNOUT	<UTIL>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
; (((TENEX)))
IFG F.TENX,<
	GJINF
	MOVEM	X2,LDIR
>
; (((↑↑↑)))
	ENDR

; D$OPEN -- OPEN PROPER <FILES> IN PROPER MODE
;   IN: IO -- MODE FLAG
;			READ IF < 0
;			WRITE IF = 0
;			APPEND IF > 0
;
D$OPEN:	BEGINR
	SKIPN	OPENED
	 JRST	D$OP05
	MOVE	X1,[POINT 7,OPENED]
	MOVE	X2,[POINT 7,NBUF]
D$OP01:	ILDB	X3,X1
	ILDB	X4,X2
	CAIE	X3,(X4)
	 JRST	D$OP05
	JUMPN	X3,D$OP01
	CAMN	IO,OPENEM
	 RETURN	SKIP,1
	JUMPE	IO,D$OP02
	JUMPG	IO,D$OP03
	DCSOUT	<[ASCIZ/MODE "<FILES"> READ/],SEMI>
	JRST	D$OP04
D$OP02:	DCSOUT	<[ASCIZ/MODE "<FILES"> WRITE/],SEMI>
	JRST	D$OP04
D$OP03:	DCSOUT	<[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
D$OP04:	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVEM	IO,OPENEM
	RETURN	SKIP,1
D$OP05:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+2
	JRST	D$OP06
	TSOUT	<[ASCIZ/ (There are no <FILES>)/],CRLF>
	RETURN
D$OP06:	SKIPN	OPENED
	 JRST	D$OP07
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	SETZM	OPENED
D$OP07:	JUMPE	IO,D$OP08
	JUMPG	IO,D$OP09
	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> READ/],SEMI>
	JRST	D$OP10
D$OP08:	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> WRITE/],SEMI>
	JRST	D$OP10
D$OP09:	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
D$OP10:	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[POINT 7,NBUF]
	MOVE	X2,[POINT 7,OPENED]
	SCOPY	(X1,X2)
	MOVEM	IO,OPENEM
	ENDR	SKIP,1

; D$VER -- PRODUCE PROPER VERSION NUMBER
;   IN: IO -- DEFAULT FLAG
;			SMALLEST UNDELETED VERSION IF < 0
;			LARGEST VERSION IF = 0
;			LARGEST DELETED VERSION IF = "D"
;			LARGEST UNDELETED VERSION IF = " "
;   OUT: IO -- VERSION (IF DEFAULT)
;
D$VER:	BEGINR	<UTIL>
	SKIPE	VBUF
	 RETURN	SKIP,1
	JUMPE	IO,D$VER1
	LDB	UTIL,[350700,,FBUF]
	CAIN	UTIL,"*"
	 SETOM	VBUF
	LDB	UTIL,[350700,,EBUF]
	CAIN	UTIL,"*"
	 SETOM	VBUF
	SKIPE	VBUF
	 RETURN	SKIP,1
	JUMPG	IO,D$VER2
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE LEAST INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	LEAST=-1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	      AND (STATUS EQ ' ')/],[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		IF LEAST EQ -1 THEN LEAST=VERSION ELSE
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/			IF LEAST GT VERSION THEN LEAST=VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF LEAST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT '}' ! LEAST
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	JRST	D$VERE
D$VER1:	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE GREATEST INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	GREATEST=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">/]>
	CALLR	D$WITH
	DCSOUT	<[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		IF GREATEST LT VERSION THEN GREATEST=VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	COMMENT '}' ! GREATEST
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	JRST	D$VERE
D$VER2:	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE GREATEST INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	GREATEST=-1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	      AND (STATUS EQ '/]>
	DCBOUT	<IO>
	SKIPN	FLAGDD
	 JRST	D$VER$
	TBOUT	<IO>
D$VER$:	DCSOUT	<[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		IF GREATEST LT VERSION THEN GREATEST=VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF GREATEST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT '}' ! GREATEST
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
D$VERE:	MOVE	IO,[ASCII/;A282/]
	CALLR	RENFIP
	 RETURN
D$VERN:	DCBIN	<IO>
	CAIE	IO,"}"
	 JRST	D$VERN
	CALLR	DCNIN
	MOVEM	IO,VBUF
	CALLR	RENLIN
	CALLR	RENDER
	 RETURN
	ENDR	SKIP,1

; D$VEX -- VERIFY THAT VERSION EXISTS
;
D$VEX:	BEGINR	<IO>
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE EXTANT INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	EXTANT=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	      AND (VERSION EQ /]>
	MOVE	IO,VBUF
	DCNOUT	<IO>
	DCSOUT	<[ASCIZ/)
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		AND (STATUS EQ ' ')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/			EXTANT=EXTANT+1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF EXTANT NE 1 THEN ERROR 'NO SUCH FILE'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	CALLR	RENDER
	 RETURN
	ENDR	SKIP,1

; D$WITH -- GENERATE A QUALIFIED WITH CLAUSE (CONSIDER *'S)
;   IN: IO -- POINTER TO FIXED QUALIFIER (OR 0)
;   FLAGS:
	D$W$F==400000
	D$W$E==200000
	D$W$V==100000
	D$W$Q==010000
;
D$WITH:	BEGINR	<UTIL,FLAG>
	SETZ	FLAG,
	LDB	UTIL,[350700,,FBUF]
	CAIE	UTIL,"*"
	 TRO	FLAG,D$W$F
	LDB	UTIL,[350700,,EBUF]
	CAIE	UTIL,"*"
	 TRO	FLAG,D$W$E
	SKIPLE	VBUF
	 TRO	FLAG,D$W$V
	SKIPE	IO
	 TRO	FLAG,D$W$Q
	JUMPE	FLAG,RETN(0)
	DCSOUT	<[ASCIZ/ WITH/]>
	TRNN	FLAG,D$W$F
	 JRST	D$WIT1
	DCSOUT	<[ASCIZ/ FILENAME EQ '/],FBUF,[ASCIZ/'/]>
	TRNN	FLAG,D$W$E!D$W$V!D$W$Q
	 RETURN
	DCSOUT	<[ASCIZ/ AND/]>
D$WIT1:	TRNN	FLAG,D$W$E
	 JRST	D$WIT2
	DCSOUT	<[ASCIZ/ EXTENSION EQ '/],EBUF,[ASCIZ/'/]>
	TRNN	FLAG,D$W$V!D$W$Q
	 RETURN
	DCSOUT	<[ASCIZ/ AND/]>
D$WIT2:	TRNN	FLAG,D$W$V
	 JRST	D$WIT3
	DCSOUT	<[ASCIZ/ VERSION EQ /]>
	MOVE	UTIL,VBUF
	DCNOUT	<UTIL>
	TRNN	FLAG,D$W$Q
	 RETURN
	DCSOUT	<[ASCIZ/ AND/]>
D$WIT3:	TRNN	FLAG,D$W$Q
	 RETURN
	DCSOUT	<(IO)>
	ENDR

; NETSUM -- NETWORK CHECKSUM VERIFICATION
;
NETSUM:	BEGINR	<IO,FLAG>
	CALLR	RENPRE
	CAME	IO,[ASCII/;I275/]
	 JRST	NETS2
	SETZ	FLAG,
NETS1:	DCBIN	<IO>
	CAIE	IO,"="
	 JRST	NETS1
	SKIPN	FLAG
	 SOJA	FLAG,NETS1
	CALLR	DCNIN
	CAME	IO,NSUM
	 JRST	NETS3
	CALLR	RENLIN
	RETURN
NETS2:	CALLR	RENLIP
	RETURN
NETS3:	CALLR	RENLIN
	TSOUT	<[ASCIZ/ (Network Checksum Error)/],CRLF>
	ENDR

; NETRAT -- CALCULATE AND PRINT RATE
;
NETRAT:	BEGINR	<IO,<IO+1>>
	TSOUT	<[ASCIZ/ (/]>
	MOVEI	IO,↑D36
	IMULB	IO,NSIZE
	IDIV	IO,NTIME
	TNOUT	<IO>
	TSOUT	<[ASCIZ/ Baud (/]>
	MOVE	IO,NSIZE
	TNOUT	<IO>
	TSOUT	<[ASCIZ/ bits in /]>
	MOVE	IO,NTIME
	CAIN	IO,0
	 MOVEI	IO,1
	TNOUT	<IO>
	HRRZI	<IO+1>,[ASCIZ/ seconds))/]
	CAIN	IO,1
	 HRRZI	<IO+1>,[ASCIZ/ second))/]
	TSOUT	<(IO+1),CRLF>
	ENDR

; RENDER -- REQUEST ENDER (ASSUMES INITIAL RENLIN)
;
RENDER:	BEGINR	<IO,UTIL,FLAG>
	SETZ	FLAG,
RENDSL:	CALLR	RENPRE
	CAMN	IO,[ASCII/.I220/]
	 JRST	RENDES
	CAMN	IO,[ASCII/.I210/]
	 JRST	RENDRR
	CAMN	IO,[ASCII/;A282/]
	 JRST	RENDPM
	CAMN	IO,[ASCII/.J151/]
	 JRST	RENDPM
	LDB	UTIL,[350700,,IO]
	CAIN	UTIL,"+"
	 JRST	RENDMM
	CAIN	UTIL,"-"
	 JRST	RENDMM
	JRST	RENDFL
RENDMM:	SETO	FLAG,
	SKIPN	FLAGDE
	 JRST	RENDFL
	SETZM	FLAGDE
RENDPM:	CALLR	RENLIP
	JRST	RENDSL
RENDFL:	CALLR	RENLIN
	JRST	RENDSL
RENDES:	CALLR	RENLIN
	MOVEI	IO,"L"-100
	DCBOUT	<IO>
	SETO	FLAG,
	JRST	RENDSL
RENDRR:	CALLR	RENLIN
	JUMPN	FLAG,RETN(0)
	ENDR	SKIP,1

; RENFIP -- FIND PREFIX (ASSUMES INITIAL RENLIN)
;   IN: IO -- PREFIX
;
RENFIP:	BEGINR	<BP,UTIL,FLAG>
	MOVE	FLAG,IO
	SETZ	UTIL,
RENFIL:	CALLR	RENPRE
	CAMN	IO,FLAG
	 RETURN	SKIP,1
	LDB	BP,[350700,,IO]
	CAIN	BP,";"
	 JRST	RENFIN
	CAIN	BP,"."
	 JRST	RENFIN
	SKIPN	UTIL
	 CALLR	RENLIP
	SKIPE	UTIL
	 CALLR	RENLIN
	AOJA	UTIL,RENFIL
RENFIN:	CALLR	RENLIN
	CAMN	IO,[ASCII/.I220/]
	 JRST	RENFIS
	CAMN	IO,[ASCII/.I210/]
	 RETURN
	JRST	RENFIL
RENFIS:	MOVEI	IO,"L"-100
	DCBOUT	<IO>
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; RENLIN -- REQUEST END: PROCEED TO NEW LINE
;
RENLIN:	BEGINR	<IO>
RENLNL:	DCBIN	<IO>
	CAIE	IO,12
	 JRST	RENLNL
	ENDR

; RENLIP -- REQUEST END: PROCEED TO NEW LINE, PRINT MESSAGE
;
RENLIP:	BEGINR	<IO>
	SKIPN	FLAGDD
	 JRST	RENLPF
RENLPL:	DCBIN	<IO>
	CAIE	IO,12
	 JRST	RENLPL
	RETURN
RENLPF:	DCBIN	<IO>
	CAIN	IO,12
	 RETURN
	CAIE	IO,11
	 JRST	RENLPF
	MOVEI	IO," "
	TBOUT	<IO>
	MOVEI	IO,"("
RENLPP:	TBOUT	<IO>
RENLPQ:	DCBIN	<IO>
	CAIN	IO,42
	 JRST	RENLPQ
	CAIE	IO,15
	 JRST	RENLPP
	DCBIN	<IO>
	MOVEI	IO,")"
	TBOUT	<IO>
	TSOUT	<CRLF>
	ENDR

; RENPRE -- REQUEST END: RETURN ERROR PREFIX (ASSUMES RENLIN)
;   OUT: IO -- ASCII PREFIX (5 BYTES)
;
RENPRE:	BEGINR	<BP,UTIL,FLAG>
RENPRP:	SETZ	IO,
	MOVE	BP,[POINT 7,IO]
	MOVEI	FLAG,5
RENPRL:	DCBIN	<UTIL>
	CAIN	UTIL,15
	 JRST	RENPRL
	CAIN	UTIL,12
	 JRST	RENPRL
	IDPB	UTIL,BP
	SOJG	FLAG,RENPRL
	LDB	UTIL,[350700,,IO]
	CAIN	UTIL,"?"
	 JRST	DEATH
	CAIE	UTIL,"!"
	 RETURN
	SKIPN	FLAGNN
	 CALLR	RENLIP
	JRST	RENPRP
	ENDR

; DEATH -- FATAL DATACOMPUTER ERROR (? MESSAGE)
;
DEATH:	CALLR	RENLIP
	TSOUT	<[ASCIZ/ ?? Fatal Datacomputer Error ??/],CRLF>
; (((ITS)))
IFL F.TENX,<
	.VALUE
	.BREAK 16,160000
>
; (((TOPS-10)))
IFE F.TENX,<
	EXIT
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	HALTF
	JRST	.-1
>
; (((↑↑↑)))

SUBTTL	I/O ROUTINES
PRINTX (I/O routines)

; TAIN -- TERMINAL AUTHORIZATION INPUT
;   IN: X1 -- POINTER TO CONFIRMATION MESSAGE
;
$TAIN$:	BEGINR	<IO>
	MOVEI	IO,(X1)
	TSOUT	<(IO)>
TAIN1:	TBIN	<IO>
	CAIN	IO,15
	 JRST	TAIN1
	CAIN	IO,"R"-100
	 JRST	TAIN1
	CAIN	IO,"N"
	 JRST	TAIN2
	CAIN	IO,"Y"
	 JRST	TAIN3
	CAIN	IO,12
	 JRST	TAIN4
	CAIN	IO,33
	 JRST	TAIN4
	CAIN	IO,37
	 JRST	TAIN4
	CAIN	IO," "
	 JRST	TAIN4
	TSOUT	<[ASCIZ/XXX/],CRLF>
	RETURN
TAIN2:	TSOUT	<[ASCIZ/No/],CRLF>
	RETURN	SKIP,1
TAIN3:	TSOUT	<[ASCIZ/Yes/]>
TAIN4:	TSOUT	<CRLF>
	ENDR	SKIP,2

; TERMINAL COMMAND INPUT ROUTINE
;
;   WHEN ENOUGH OF A COMMAND IS RECEIVED TO UNIQUELY IDENTIFY IT,
;     INPUT NOT CONFORMING TO THE REST OF THE COMMAND IS NOT ACCEPTED.
;   IF THE COMMAND IS UNIQUELY IDENTIFIED, AN ALTMODE, CARRIAGE RETURN,
;     LINE FEED, EOL, OR SPACE WILL FINISH IT.
;     IF NOT, SUCH CHARACTERS WILL BE REJECTED.
;   ↑A DELETES THE LA AND RUBOUTST CHARACTER, ↑R RETYPES THE INPUT LINE,
;     ↑X AND ↑U DELETE THE LINE (RETURN TCIO=-1).
;
;	IN: TCIO -- POINTER TO ↑R TEXT,,POINTER TO CONTROL BLOCK
;			POINTER TO COMMAND STRING LIST
;			NUMBER OF COMMANDS
;			NUMBER OF CHARACTERS IN LARGEST COMMAND STRING
;			NUMBER OF WORDS IN LARGEST COMMAND STRING
;			<VALUE LIST>
;			<COMMAND STRING LIST>
;	OUT: TCIO -- LAST CHAR INPUT
;	     FLAG -- COMMAND VALUE
;	RETURNS: SKIP,0 -- DELETE LINE
;		 SKIP,1 -- NULL COMMAND
;		 SKIP,2 -- COMMAND RECOGNIZED
;
$TCIN$:	BEGINR	<TCIBP,TCIACB,TCITLP,TCITCC,TCIPBP,TCIPCC,TCISBP,TCISCC,TCIMAC,TCIMAN,UTIL>
	MOVE	TCIACB,TCIO
	SETZ	UTIL,
TCII01:	MOVEM	UTIL,TCIPCL(UTIL)
	ADDI	UTIL,1
	CAME	UTIL,1(TCIACB)
	 JRST	TCII01
	ADDI	UTIL,TCIPCL
	MOVEM	UTIL,TCIPNF
	HRRI	UTIL,TCIPCL
	HRL	UTIL,1(TCIACB)
	MOVEM	UTIL,TCIPLP
	MOVE	TCIBP,[POINT 7,ABUF]
	HRLI	TCISBP,350700
	HRR	TCISBP,(TCIACB)
	SETZ	TCISCC,
TCICHR:	TBIN	<TCIO>
	CAIN	TCIO,"R"-100
	 JRST	TCIREP
	CAIN	TCIO,"?"
	 JRST	TCIQUA
	CAIN	TCIO,"A"-100
	 JRST	TCIDEL
	CAIN	TCIO,"U"-100
	 JRST	TCIENR
	CAIN	TCIO,"X"-100
	 JRST	TCIENR
	CAIN	TCIO,177
	 JRST	TCIDEL
	CAIN	TCIO,15
	 JRST	TCICHR
	CAIN	TCIO,12
	 JRST	TCIC01
	CAIN	TCIO,37
	 JRST	TCIC01
	CAIN	TCIO," "
	 JRST	TCIC01
	CAIN	TCIO,33
	 JRST	TCIC01
	CAIG	TCIO," "
	 JRST	TCIBAD
	JRST	TCIC02
TCIC01:	JUMPE	TCISCC,TCIENN
	HLRZ	UTIL,TCIPLP(TCISCC)
	CAIN	UTIL,1		; OK IF JUST ONE POSSIBILITY
	 JRST	TCIEND
TCIC02:	SETZ	TCIPCC,
	MOVE	TCIPBP,TCISBP
	MOVE	UTIL,TCIPNF
	MOVEM	UTIL,<TCIPLP+1>(TCISCC)
	SETZ	TCIMAC,
	HRRZI	TCIMAN,-1
TCIC03:	LDB	UTIL,TCIPBP
	JUMPE	UTIL,TCIC04
	CAIE	UTIL,(TCIO)
	 JRST	TCIC08
TCIC04:	HLRZ	TCITCC,TCIPLP(TCISCC)
	HRRZ	TCITLP,TCIPLP(TCISCC)
TCIC05:	MOVE	UTIL,(TCITLP)
	CAIN	UTIL,(TCIPCC)
	 JRST	TCIC06
	AOJ	TCITLP,
	SOJG	TCITCC,TCIC05
	JRST	TCIC08
TCIC06:	LDB	UTIL,TCIPBP
	JUMPE	UTIL,TCIC07
	AOJ	TCIMAC,
	MOVEM	TCIPCC,@TCIPNF
	AOS	TCIPNF
	JRST	TCIC08
TCIC07:	CAIN	TCIMAN,-1
	 SETO	TCIMAN,
	CAIE	TCIMAN,-1
	 HRRZI	TCIMAN,(TCIPCC)
TCIC08:	ADD	TCIPBP,3(TCIACB)
	AOJ	TCIPCC,
	CAME	TCIPCC,1(TCIACB)
	 JRST	TCIC03
	CAIN	TCIO,12
	 JRST	TCIC09
	CAIN	TCIO,37
	 JRST	TCIC09
	CAIN	TCIO," "
	 JRST	TCIC09
	CAIE	TCIO,33
	 JRST	TCIC10
TCIC09:	JUMPL	TCIMAN,TCIBAD
	CAIN	TCIMAN,-1
	 JRST	TCIBAD
	JRST	TCIEND
TCIC10:	JUMPE	TCIMAC,TCIBAD
	AOJ	TCISCC,
	HRLM	TCIMAC,TCIPLP(TCISCC)
	IBP	TCISBP
	IDPB	TCIO,TCIBP
	TBOUT	<TCIO>		; ECHO
	JRST	TCICHR
TCIBAD:	MOVEI	TCIO,"G"-100
	TBOUT	<TCIO>
	JRST	TCICHR
TCIREP:	TSOUT	<CRLF>
	HLRZ	UTIL,TCIACB
	TSOUT	<(UTIL)>
	HRRZI	TCIPCC,(TCISCC)	; OUTPUT LOOP CONTROL = CHARS SO FAR
	MOVE	TCIPBP,[POINT 7,ABUF]
TCIR01:	SOJL	TCIPCC,TCICHR
	ILDB	TCIO,TCIPBP
	TBOUT	<TCIO>
	JRST	TCIR01
TCIQUA:	TBOUT	<TCIO>		; PRINT "?"
	HLRZ	TCIPCC,TCIPLP(TCISCC) ; PRINT THE POSSIBLE COMMAND LIST
	HRRZ	TCIPBP,TCIPLP(TCISCC)
TCIQ01:	TSOUT	<CRLF>
	MOVEI	TCIO,11
	TBOUT	<TCIO>
	MOVE	TCITCC,2(TCIACB)
	MOVE	TCITLP,(TCIPBP)
	IMUL	TCITLP,3(TCIACB)
	ADD	TCITLP,(TCIACB)
	HRLI	TCITLP,(POINT 7,)
TCIQ02:	ILDB	TCIO,TCITLP
	JUMPE	TCIO,TCIQ03
	TBOUT	<TCIO>
	SOJG	TCITCC,TCIQ02
TCIQ03:	AOJ	TCIPBP,
	SOJG	TCIPCC,TCIQ01
	JRST	TCIREP
TCIDEL:	JUMPLE	TCISCC,TCIENR	; THERE'S NO CHARACTER TO DELETE
	MOVEI	TCIO,"\"
	TBOUT	<TCIO>
	LDB	TCIO,TCIBP
	TBOUT	<TCIO>
	ADD TCIBP,[70000,,0]		; FIX LINE BYTE PTR
	TLNE TCIBP,400000
	 SUB TCIBP,[430000,,1]
	HRRZ	UTIL,TCIPLP(TCISCC) ; RESET TCIPNF
	MOVEM	UTIL,TCIPNF
	ADD TCISBP,[70000,,0]		; FIX SCAN BYTE PTR
	TLNE TCISBP,40000
	 SUB TCISBP,[430000,,1]
	SOJA	TCISCC,TCICHR
TCIENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETZ	FLAG,
	RETURN
TCIENN:	SETZ	FLAG,
	RETURN	SKIP,1
TCIEND:	MOVE	TCITLP,TCIPLP(TCISCC) ; COMMAND NUMBER
	MOVE	TCITLP,(TCITLP)
	IMUL	TCITLP,3(TCIACB)
	ADD	TCITLP,(TCIACB)
	HRLI	TCITLP,(POINT 7,)
	SETZ	TCITCC,
TCIE01:	IBP	TCITLP
	AOJ	TCITCC,
	CAIE	TCITCC,(TCISCC)
	 JRST	TCIE01
TCIE02:	AOJ	TCITCC,
	CAMLE	TCITCC,2(TCIACB)
	 JRST	TCIE03
	ILDB	TCIMAC,TCITLP
	JUMPE	TCIMAC,TCIE03
	TBOUT	<TCIMAC>
	JRST	TCIE02
TCIE03:	MOVE	TCITLP,TCIPLP(TCISCC)
	MOVE	FLAG,(TCITLP)
	ADDI	FLAG,4(TCIACB)
	MOVE	FLAG,(FLAG)
	ENDR	SKIP,2

; TERMINAL STRING INPUT
;   IN: IO -- POINTER TO BUFFER,,SIZE OF BUFFER
;	UTIL -- ECHO FLAG (0 IF ECHO),,POINTER TO ↑R TEXT
;   OUT: IO -- LAST CHARACTER INPUT (-1 IF DELETE LINE)
;        UTIL -- COUNT OF CHARACTERS
;
$TSIN$:	BEGINR	<BP,R10,R11,R12>
	MOVE	R10,IO
	MOVE	R11,UTIL
	HLR	BP,IO
	HRLI	BP,(POINT 7,)
	SETZ	UTIL,
TSICHR:	TBIN	<IO>
	CAIN	IO,"R"-100
	 JRST	TSIREP
	CAIN	IO,"A"-100
	 JRST	TSIDEL
	CAIN	IO,"U"-100
	 JRST	TSIENR
	CAIN	IO,"X"-100
	 JRST	TSIENR
	CAIN	IO,177
	 JRST	TSIDEL
	CAIN	IO,15
	 JRST	TSICHR
	CAIN	IO,12
	 JRST	TSIEND
	CAIN	IO,33
	 JRST	TSIEND
	CAIN	IO,37
	 JRST	TSIEND
	CAIGE	IO," "
	 JRST	TSIBAD
	CAIL	UTIL,(R10)
	 JRST	TSIBAD
	IDPB	IO,BP
	ADDI	UTIL,1
	JUMPL	R11,TSICHR
	TBOUT	<IO>
	JRST	TSICHR
TSIBAD:	MOVEI	IO,"G"-100
	TBOUT	<IO>
	JRST	TSICHR
TSIREP:	TSOUT	<CRLF>
	TSOUT	<(R11)>
	JUMPL	R11,TSICHR
	HRRZI	IO,(BP)
	HLR	R12,R10
	CAIGE	IO,(R12)
	 JRST	TSICHR
	HRLI	R12,(POINT 7,)
TSIR01:	CAMN	R12,BP
	 JRST	TSICHR
	ILDB	IO,R12
	TBOUT	<IO>
	JRST	TSIR01
TSIDEL:	JUMPE	UTIL,TSIENR
	MOVEI	IO,"\"
	TBOUT	<IO>
	LDB	IO,BP
	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	SUBI	UTIL,1
	JUMPL	R11,TSICHR
	TBOUT	<IO>
	JRST	TSICHR
TSIENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETO	IO,
	SETZ	UTIL,
	RETURN
TSIEND:	SETZ	R12,
	IDPB	R12,BP
	ENDR	SKIP,1

; TERMINAL NUMBER INPUT
;   IN: IO -- POINTER TO ↑R TEXT,,RADIX
;   OUT: IO -- NUMBER
;
$TNIN$:	BEGINR	<BP,UTIL,FLAG>
	MOVE	UTIL,IO
	MOVE	BP,[POINT 7,UBUF1]
	SETZ	FLAG,
TNICHR:	TBIN	<IO>
	CAIN	IO,"R"-100
	 JRST	TNIREP
	CAIN	IO,"A"-100
	 JRST	TNIDEL
	CAIN	IO,"U"-100
	 JRST	TNIENR
	CAIN	IO,"X"-100
	 JRST	TNIENR
	CAIN	IO,177
	 JRST	TNIDEL
	CAIN	IO,15
	 JRST	TNICHR
	CAIN	IO,12
	 JRST	TNIEND
	CAIN	IO,33
	 JRST	TNIEND
	CAIN	IO,37
	 JRST	TNIEND
	CAIN	IO," "
	 JRST	TNIEND
	CAIGE	IO,"0"
	 JRST	TNIBAD
	CAIL	IO,"0"(UTIL)
	 JRST	TNIBAD
	CAILE	FLAG,12		; MAXIMUM # OF DIGITS WITHOUT OVERFLOW
	 JRST	TNIBAD
	IDPB	IO,BP
	TBOUT	<IO>
	AOJA	FLAG,TNICHR
TNIBAD:	MOVEI	IO,"G"-100
	TBOUT	<IO>
	JRST	TNICHR
TNIREP:	TSOUT	<CRLF>
	HLRZ	IO,UTIL
	TSOUT	<(IO)>
	HRRZI	IO,(BP)
	CAIGE	IO,UBUF1
	 JRST	TNICHR
	MOVE	IO,[POINT 7,UBUF1]
TNIR01:	CAMN	IO,BP
	 JRST	TNICHR
	ILDB	X1,IO
	TBOUT	<X1>
	JRST	TNIR01
TNIDEL:	JUMPE	FLAG,TNIENR
	MOVEI	IO,"\"
	TBOUT	<IO>
	LDB	IO,BP
	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	TBOUT	<IO>
	SOJA	FLAG,TNICHR
TNIENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETZ	IO,
	RETURN
TNIEND:	SETZ	IO,
	IDPB	IO,BP
	MOVE	BP,[POINT 7,UBUF1]
	MOVEI	FLAG,(UTIL)
TNICAL:	ILDB	UTIL,BP
	JUMPE	UTIL,RETN(1)
	IMULI	IO,(FLAG)
	SUBI	UTIL,"0"
	ADDI	IO,(UTIL)
	JRST	TNICAL
	ENDR

; DCNIN -- DATACOMPUTER NUMBER INPUT
;   OUT: IO -- 36-BIT MAGNITUDE INTEGER
;
DCNIN:	BEGINR	<<IO+1>,UTIL>
	SETZ	IO,
DCNIN1:	DCBIN	<UTIL>
	CAIGE	UTIL,"0"
	 RETURN
	CAILE	UTIL,"9"
	 RETURN
	JUMPL	IO,DCNIN2
	MULI	IO,↑D10
	CAILE	IO,1
	 JRST	DCNIN2
	CAIN	IO,1
	 TLO	<IO+1>,400000
	MOVE	IO,<IO+1>
	ADDI	IO,-"0"(UTIL)
	JRST	DCNIN1
DCNIN2:	SETO	IO,
	JRST	DCNIN1
	ENDR

; $NOUT$ -- INTEGER OUTPUT
;   IN: X1 -- INTEGER
;       X2 -- T-DC FLAG (0=T,-1=DC),,RADIX
;
$NOUT$:	BEGINR	<FLAG>
	MOVE	FLAG,X2
	MOVE	X3,[POINT 7,UBUF1]
	MOVEI	X4,1
	JUMPGE	X1,NOUT1
	LSHC	X1,-↑D35
	LSH	X2,-1
	DIVI	X1,(FLAG)
	JRST	.+2
NOUT1:	IDIVI	X1,(FLAG)
	ADDI	X2,60
	IDPB	X2,X3
	SKIPE	X1
	 AOJA	X4,NOUT1
	MOVE	X1,[POINT 7,UBUF2]
NOUT2:	LDB	X2,X3
	IDPB	X2,X1
	SOJ	X3,
	IBP	X3
	IBP	X3
	IBP	X3
	IBP	X3
	SOJG	X4,NOUT2
	IDPB	X4,X1
	SKIPL	FLAG
	 JRST	NOUT3
	DCSOUT	<UBUF2>
	RETURN
NOUT3:	TSOUT	<UBUF2>
	ENDR

SUBTTL	System Dependent Routines for ITS
PRINTX (system-dependent routines)

; (((ITS)))
IFL F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	.OPEN TTI,[.UAI,,'TTY']		; TTY input
	 THUD
	.CALL [	SETZ
		SIXBIT/TTYGET/		; set TTY parameters
		MOVEI TTI		; TTY channel
		MOVEM			; first set of character groups
		MOVEM			; second set of character groups
		SETZM X1]		; TTYSTS variable
	 THUD
	TLO X1,200			; disable **MORE** processing
	MOVE [030303,,030303]		; turn off echoing
	.CALL [	SETZ
		SIXBIT/TTYSET/		; set TTY parameters
		MOVEI TTI		; TTY channel
		MOVE			; first set of character groups
		MOVE			; second set of character groups
		SETZ X1]		; TTYSTS variable
	 THUD
	.OPEN TTO,[.UAO,,'TTY']		; TTY output
	 THUD
	.CALL [	SETZ			; host number
		SIXBIT/NETHST/
		MOVEI -1
		MOVEM
		SETZM LHOST]
	 THUD
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .UII!40050	; OPEN on gensymmed socket, 32 bits
		MOVEI ICP
		[('NET')]		; network device
		[-1]			; initial local socket is gensymmed
		MOVEI DCSOKT		; initial foreign socket(DATACOMPUTER)
		SETZI DCHOST]		; foreign host(CCA)
	 JRST ICPCLS
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI ICP
		MOVEI %NSRFS
		SETZM X1]		; wait for connection
	 THUD
	MOVE X1,[ICP,,RCHBLK]
	.RCHST X1,			; get status of network channel
	HRRE X1,RCHBLK+4		; get status of network
	JUMPL X1,NETDED			; network dead if .LE. 0
	CAIN X1,%NSCLI			; CLS w/ input?
	 JRST ICPWIN
	CAIE X1,%NSINP			; input available?
	 CAIN X1,%NSOPN			; connection open?
	  JRST ICPWIN
	JUMPN X1,[THUD]			; any other condition is lossage
ICPCLS:	TSOUT <[ASCIZ/Cannot establish network connection/]>
	.BREAK 16,160000
NETDED:	TSOUT <[ASCIZ/ARPAnet is down/]>
	.BREAK 16,160000
ICPWIN:	MOVE X1,RCHBLK+1		; get gensymmed local socket
	ADDI X1,2			; receive
	MOVEM X1,LCLRCV
	ADDI X1,1			; transmit
	MOVEM X1,LCLTRN
	.IOT ICP,X1			; get foreign place's socket
	.CLOSE ICP,			; free up ICP socket right away
	MOVEM X1,FORRCV			; receive
	ADDI X1,1			; socket to me!
	MOVEM X1,FORTRN
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI 40!.UAI
		MOVEI DCI		; DATACOMPUTER input
		[('NET')]
		LCLRCV
		FORTRN
		SETZI DCHOST]
	 JRST ICPCLS
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI 40!.UAO
		MOVEI DCO		; DATACOMPUTER output
		[('NET')]
		LCLTRN
		FORRCV
		SETZI DCHOST]
	 JRST ICPCLS
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DCI
		MOVEI %NSRFS
		SETZM X1]		; wait for connection
	 THUD
	JUMPE X1,ICPCLS
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DCO
		MOVEI %NSRFS
		SETZM X1]		; wait for connection
	 THUD
	JUMPE X1,ICPCLS
	MOVEI X1,2			; offset for data sockets
	ADDM X1,LCLRCV
	ADDM X1,LCLTRN
	ADDM X1,FORRCV
	ADDM X1,FORTRN
	ENDR

; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT:	.IOT DCO,["Z"-100]		; SEND QUIT
QUIT1:	DCBIN <IO>
	JRST QUIT1
QUIT2:	.CLOSE DCI,
	.CLOSE DCO,
	.BREAK 16,160000

; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BII
		MOVEI DDI		; DATACOMPUTER data input
		[('NET')]
		LCLRCV
		FORTRN
		SETZI DCHOST]
	 THUD
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DDI
		MOVEI %NSRFS
		SETZM X1]		; wait for connection
	 THUD
	JUMPE X1,ICPCLS
	RETURN SKIP,1
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BIO
		MOVEI DDO		; DATACOMPUTER data output
		[('NET')]
		LCLTRN
		FORRCV
		SETZI DCHOST]
	 THUD
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DDO
		MOVEI %NSRFS
		SETZM X1]		; wait for connection
	 THUD
	JUMPE X1,ICPCLS
	RETURN SKIP,1
	ENDR

; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
	.CLOSE DDI,
	.CLOSE DDO,
	ENDR

; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
;
NETDSI:	BEGINR
	MOVE UTIL,LCLRCV
	ENDR

; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
;
NETDSO:	BEGINR
	MOVE UTIL,LCLTRN
	ENDR

; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BII
		MOVEI LCI
		[('DSK')]
		LCLFN1
		LCLFN2
		SETZ LCLSNM]
	 JRST LOCOI1
	RETURN SKIP,1
LOCOI1:	TSOUT <[ASCIZ/ (Local file not found)/],CRLF>
	ENDR

;LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BIO
		MOVEI LCO
		[('DSK')]
		LCLFN1
		LCLFN2
		SETZ LCLSNM]
	 THUD
	.CALL [	SETZ
		SIXBIT/SFDATE/
		MOVEI LCO
		SETZ LCLDAT]
	 THUD
	RETURN SKIP,1
	ENDR

; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	.CLOSE LCI,
	.CLOSE LCO,
	ENDR

; LOCS -- LOCAL FILE (SIZE)
;
LOCS:	BEGINR
	.CALL [	SETZ
		SIXBIT/FILLEN/
		MOVEI LCI
		SETZM IO]
	 SETZ IO,			; it should not crap out
	ENDR

; LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
;   IN: IO -- ADDRESS OF TIME STRING
;  OUT:	UTIL -- ITS DISK FORMAT DATE/TIME
;
LUTTSN:	BEGINR <BP>
	SETZ UTIL,
	ILDB X1,IO
	CAIL X1,"0"
	 CAILE X1,"9"
	  RETURN
	SUBI X1,"0"
	IMULI X1,↑D10
	ILDB X2,IO
	CAIL X2,"0"
	 CAILE X2,"9"
	  RETURN
	ADDI X1,-"0"(X2)
	ILDB X2,IO
	CAIE X2,"-"
	 RETURN
	MOVE X2,[POINT 7,X3]
	SETZ X3,
REPEAT 3,<
	ILDB X4,IO
	IDPB X4,X2
>
	MOVEI X2,↑D12
	CAMN X3,LUTTM-1(X2)
	 JRST .+3
	  SOJGE X2,.-2
	  RETURN
	ILDB X3,IO
	CAIE X3,"-"
	 RETURN
	ILDB X3,IO
	CAIL X3,"0"
	 CAILE X3,"9"
	  RETURN
	SUBI X3,"0"
	IMULI X3,↑D10
	ILDB X4,IO
	CAIL X4,"0"
	 CAILE X4,"9"
	  RETURN
	ADDI X3,-"0"(X4)
	DPB X3,[POINT 7,UTIL,8]
	DPB X2,[POINT 4,UTIL,12]
	DPB X1,[POINT 5,UTIL,17]
	ILDB X1,IO
	CAIE X1," "
	 RETURN
	ILDB X1,IO
	SUBI X1,"0"
	IMULI X1,↑D10
	ILDB X2,IO
	ADDI X1,-"0"(X2)
	IMULI X1,6
	ILDB X2,IO
	CAIE X2,":"
	 RETURN
	ILDB X2,IO
	ADDI X1,-"0"(X2)
	IMULI X1,↑D10
	ILDB X2,IO
	ADDI X1,-"0"(X2)
	IMULI X1,6
	ILDB X2,IO
	CAIE X2,":"
	 JRST [	IMULI X1,↑D20
		JRST LUTSN1]
	ILDB X2,IO
	ADDI X1,-"0"(X2)
	IMULI X1,↑D10
	ILDB X2,IO
	ADDI X1,-"0"(X2)
	LSH X1,1
LUTSN1:	ADDI UTIL,(X1)
	ENDR

; LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
;   IN:	UTIL -- ITS DISK FORMAT DATE/TIME
;	BP -- BYTE POINTER TO DESTINATION STRING
;  OUT:	BP -- UPDATED BYTE POINTER
;
LUTTNS:	BEGINR
	LDB X3,[POINT 5,UTIL,17]	; DAY
	IDIVI X3,↑D10
	ADDI X3,"0"
	ADDI X4,"0"
	IDPB X3,BP
	IDPB X4,BP
	MOVEI X3,"-"
	IDPB X3,BP
	LDB X3,[POINT 4,UTIL,12]	; MONTH
	HRRI X3,LUTTM-1(X3)
	HRLI X3,(POINT 7,)
	SCOPY (X3,BP)
	MOVEI X3,"-"
	IDPB X3,BP
	LDB X3,[POINT 7,UTIL,8]	; YEAR
	IDIVI X3,↑D10
	ADDI X3,"0"
	ADDI X4,"0"
	IDPB X3,BP
	IDPB X4,BP
	MOVEI X3," "
	IDPB X3,BP
	LDB X2,[POINT 17,UTIL,34]	; TIME IN SECONDS
	IDIVI X2,↑D3600
	MOVEI X4,(X3)
	IDIVI X2,↑D10
	ADDI X2,"0"
	ADDI X3,"0"
	IDPB X2,BP
	IDPB X3,BP
	MOVEI X2,":"
	IDPB X2,BP
	MOVEI X2,(X4)
	IDIVI X2,↑D60
	MOVEI X4,(X3)
	IDIVI X2,↑D10
	ADDI X2,"0"
	ADDI X3,"0"
	IDPB X2,BP
	IDPB X3,BP
	MOVEI X2,":"
	IDPB X2,BP
	MOVEI X2,(X4)
	IDIVI X2,↑D10
	ADDI X2,"0"
	ADDI X3,"0"
	IDPB X2,BP
	IDPB X3,BP
	SETZ X2,
	IDPB X2,BP
	ENDR				; return

; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LUTTM:	ASCII/JAN/
	ASCII/FEB/
	ASCII/MAR/
	ASCII/APR/
	ASCII/MAY/
	ASCII/JUN/
	ASCII/JUL/
	ASCII/AUG/
	ASCII/SEP/
	ASCII/OCT/
	ASCII/NOV/
	ASCII/DEC/

; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IO -- POINTER TO ASCIZ STRING
;
LUTFN:	BEGINR <IO>
	SETZM LCLFN1			; < prevent assembly error
	MOVSI X1,'>  '
	MOVEM X1,LCLFN2
	HRLI IO,(POINT 7,)
LUTFN1:	CALLR LUTWRD			; get a SIXBIT word
	MOVEM X1,LCLFN1
	JUMPE X2,RETN(0)
	CAIE X2,"."
	 JRST LUTFN1
	CALLR LUTWRD
	CAIE X1,
	 MOVEM X1,LCLFN2		; use FN2 if specified
	ENDR

; LUTWRD -- LOCAL UTILITY: GET A SIXBIT WORD IN X1, DELIMITER IN X2
;
LUTWRD:	BEGINR <BP>
	SETZ X1,			; initialize word, word pointer
	MOVE BP,[POINT 6,X1]
LUTWR1:	ILDB X2,IO			; get a character from buffer
	CAIN X2,"."
	 JRST RETN(0)
	JUMPE X2,RETN(0)
	SUBI X2," "			; SIXBITify from ASCII
	TRNN X1,77			; and save in word until word filled
	 IDPB X2,BP
	JRST LUTWR1
	ENDR

; NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
;
NETFFI:	BEGINR
	SETZM FFITYP
	SETO X1,
	CAME X1,FSBUF
	 CAMN X1,ESBUF
	  CAIA
	   JRST NETFI1
	.IOT TTO,[" "]
	.IOT TTO,["("]
	SETOM FFITYP
NETFI1:	MOVE X1,[POINT 6,LCLFN1]
	MOVEI X2,6
	MOVE X3,[POINT 7,FBUF]
	ILDB X4,X1
	JUMPE X4,.+4
	ADDI X4," "
	SKIPE FFITYP
	 .IOT TTO,X4
	SKIPE GBUF1
	 IDPB X4,X3
	SOJG X2,.-7
NETFI2:	SKIPE FFITYP
	 .IOT TTO,["."]
	MOVE X1,[POINT 6,LCLFN2]
	MOVEI X2,6
	MOVE X3,[POINT 7,EBUF]
	ILDB X4,X1
	JUMPE X4,.+4
	ADDI X4," "
	SKIPE FFITYP
	 .IOT TTO,X4
	SKIPE GBUF2
	 IDPB X4,X3
	SOJG X2,.-7
NETFI3:	SKIPN FFITYP
	 RETURN
	.IOT TTO,[")"]
	.IOT TTO,[15]
	.IOT TTO,[12]
	ENDR

; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL:	BEGINR <IO,BP,UTIL>
	SETZM IOBUFR
	MOVE X1,[IOBUFR,,IOBUFR+1]
	BLT X1,IOBUFR+1777
	.RDTIM X1,
	IDIVI X1,↑D30
	MOVEM X1,NTIME
	MOVE BP,[POINT 7,IOBUFR]
	MOVE UTIL,[POINT 7,FBUF]
	SCOPY (UTIL,BP)
	MOVE BP,UTIL
	MOVE UTIL,[POINT 7,EBUF]
	SCOPY (UTIL,BP)
	MOVE BP,UTIL
	.CALL [	SETZ
		SIXBIT/RFDATE/
		MOVEI LCI
		SETZM UTIL]
	 MOVSI UTIL,124201
	CALLR LUTTNS
	.CALL [	SETZ
		SIXBIT/RQDATE/
		SETZM UTIL]
	 MOVSI UTIL,124201
	CALLR LUTTNS
	HRLI BP,004400
	MOVE UTIL,VBUF
	IDPB UTIL,BP
	CALLR LOCS
	IDPB IO,BP
	MOVNI UTIL,17
	IDPB UTIL,BP
	HRRZI BP,(BP)
	MOVEI X1,(BP)
	SUBI BP,IOBUFR-1
	MOVEM BP,NSIZE
	SETZ UTIL,
	ADD UTIL,(X1)
	SOJ X1,
	SOJG BP,.-2
	ADDM UTIL,NSUM
	MOVN X1,NSIZE
	HRLS X1
	HRRI X1,IOBUFR
	MOVEM X1,X1SAVE#
	CALLR NETMSG
	 JRST DEATH
	MOVE X1,X1SAVE#
	.IOT DDO,X1
	ENDR

; PUTDAT -- MOVE DATA: LOCAL TO NETWORK (PUT)
;
PUTDAT:	BEGINR <UTIL,IO>
	CALLR LOCS			; get length of file
	AOS NSIZE
	ADDM IO,NSUM
	ADDM IO,NSIZE
	CALLR NETMSG
	 JRST PUTD4
	HRROI X1,IO
	.IOT DDO,X1
	SETZ UTIL,
PUTD1:	MOVE X1,[-2000,,IOBUFR]
	.IOT LCI,X1			; read 1K from local file
	JUMPL X1,PUTD2			; hit EOF here
	CALLR NETMSG
	 JRST PUTD4
	MOVE X1,[-2000,,IOBUFR]
	.IOT DDO,X1
	MOVSI X1,-2000			; compute checksum
	ADD UTIL,IOBUFR(X1)
	AOBJN X1,.-1
	JRST PUTD1
PUTD2:	MOVEM X1,X1SAVE#
	CALLR NETMSG
	 JRST PUTD4
	MOVE X1,X1SAVE#
	MOVEI X1,-IOBUFR(X1)		; get # of words transferred
	JUMPE X1,PUTD3
	MOVNS X1
	HRLZS X1
	MOVEM X1,X1SAVE#
	CALLR NETMSG
	 JRST PUTD4
	MOVE X1,X1SAVE#
	HRRI X1,IOBUFR
	.IOT DDO,X1
	MOVE X1,X1SAVE#
	ADD UTIL,IOBUFR(X1)
	AOBJN X1,.-1
PUTD3:	ADDM UTIL,NSUM
	ADDM UTIL,NSUM
	CALLR NETMSG
	 JRST PUTD4
	HRROI X1,UTIL
	.IOT DDO,X1
PUTD4:	.RDTIM X1,
	IDIVI X1,↑D30
	SUBM X1,NTIME
	ENDR

; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL:	BEGINR <IO,UTIL>
	.RDTIM X1,
	IDIVI X1,↑D30
	MOVEM X1,NTIME
	MOVE IO,[-GET$F,,FBUF]
	.IOT DDI,IO
	JUMPL IO,RETN(0)
	MOVEI IO,GET$F
	MOVEM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<FBUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[-GET$E,,EBUF]
	.IOT DDI,IO
	MOVEI IO,GET$E
	ADDM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<EBUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[-GET$D,,ABUF]
	.IOT DDI,IO
	MOVEI IO,GET$D
	ADDM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<ABUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[POINT 7,ABUF]
	CALLR LUTTSN
	MOVEM UTIL,LCLDAT
	HRROI IO,ABUF
	.IOT DDI,IO
	AOS NSIZE
	MOVE X1,ABUF
	ADDM X1,NSUM
	HRROI IO,ABUF
	.IOT DDI,IO
	AOS NSIZE
	MOVE X1,ABUF
	ADDM X1,NSUM
	ENDR SKIP,1

; GETDAT -- GET-RETRIEVE FILE DATA
;
GETDAT:	BEGINR <IO,UTIL,FLAG>
	HRROI IO,FLAG
	.IOT DDI,IO
	JUMPE FLAG,GETD3
	ADDM FLAG,NSUM
	AOS NSIZE
	ADDM FLAG,NSIZE
	SETZ UTIL,
GETD1:	CAIGE FLAG,2000
	 JRST GETD2
	SUBI FLAG,2000
	MOVE X1,[-2000,,IOBUFR]
	.IOT DDI,X1			; read 1K from DATACOMPUTER
	MOVE X1,[-2000,,IOBUFR]
	.IOT LCO,X1
	MOVSI X1,-2000			; compute checksum
	ADD UTIL,IOBUFR(X1)
	AOBJN X1,.-1
	JRST GETD1
GETD2:	JUMPE FLAG,GETD3
	MOVN X1,FLAG
	HRLZS X1
	HRRI X1,IOBUFR
	MOVEM X1,X1SAVE#
	MOVE X1,X1SAVE#
	.IOT DDI,X1
	MOVE X1,X1SAVE#
	.IOT LCO,X1
	MOVE X1,X1SAVE#
	ADD UTIL,(X1)
	AOBJN X1,.-1
GETD3:	ADDM UTIL,NSUM
	HRROI IO,ABUF
	.IOT DDI,IO
	MOVE IO,ABUF
	ADDM IO,NSUM
	AOS NSIZE
	HRROI IO,ABUF
	.IOT DDI,IO
	MOVE IO,ABUF
	ADDM IO,NSUM
	AOS NSIZE
	CAMN IO,UTIL
	 JRST GETD4
	TSOUT <[ASCIZ/ (File Checksum Error)/],CRLF>
GETD4:	.RDTIM X1,
	IDIVI X1,↑D30
	SUBM X1,NTIME
	ENDR

; NETMSG -- HANDLE PENDING MESSAGES
;
NETMSG:	BEGINR <IO>
	SKIPE FLAGSM		; Is NETMSG allowed to eat datalanguage?
	 RETURN SKIP,1		; no!!
NETMS1:	.CALL [	SETZ
		SIXBIT/WHYINT/
		MOVEI DCI
		MOVEM IO
		MOVEM IO
		SETZM IO]
	 THUD
	JUMPE IO,RETN(1)
	DCBIN <IO>
	CAIN IO,"?"
	 JRST DEATH
	CAIN IO,"!"
	 JRST NETMS2
	CAIE IO,"+"
	 CAIN IO,"-"
	  JRST NETMS3
	CAIN IO,"."
	 JRST NETMS4
	CALLR RENLIN
	JRST NETMS1
NETMS2:	CALLR RENLIP
	JRST NETMS1
NETMS3:	CALLR RENLIP
	RETURN
NETMS4:	SETOM FLAGSM		; forbid any more gobbling
	CALLR RENLIN
	ENDR SKIP,1

; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI:	BEGINR <IO>
	SETZM GBUF1
	LDB X1,[350700,,FBUF]
	CAIN X1,"*"
	 SETOM GBUF1
	SETZM GBUF2
	LDB X1,[350700,,EBUF]
	CAIN X1,"*"
	 SETOM GBUF2
	SETO X1,
	CAMN X1,FSBUF
	 JRST LOCFI0
	CAMN X1,ESBUF
	 JRST LOCFI0
	JRST LOCFI5
LOCFI0:	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BII
		MOVEI
		[('DSK')]
		['.FILE.']
		['(DIR) ']
		SETZ LCLSNM]
	 JRST LOCFNF
	MOVE X1,[-2000,,DIRBLK]
	.IOT X1
	.CLOSE
LOCFI1:	MOVE IO,DIRBLK+1		; POINTER TO NAME AREA
	ADDI IO,DIRBLK
	CAIN IO,DIRBLK+2000		; END OF DIRECTORY?
	 JRST LOCFNF
	MOVEI X1,5
	ADDM X1,DIRBLK+1
	SETO X1,
	CAME X1,FSBUF
	 JRST LOCFI2
	CAME X1,ESBUF
	 JRST LOCFI3
	JRST LOCFI4
LOCFI2:	MOVE X1,[POINT 7,FSBUF]
	MOVE X2,[POINT 6,X4]
	MOVEI X3,6
	SETZ X4,
	ILDB X1
	CAIN "."
	 JRST .+5
	JUMPE .+4
	SUBI " "
	IDPB X2
	SOJG X3,.-6
	CAMN X4,(IO)
	 JRST LOCFI4
	JRST LOCFI1
LOCFNF:	TSOUT <[ASCIZ/ (No Such File)/],CRLF>
	RETURN

LOCFI3:	MOVE X1,[POINT 7,ESBUF]
	MOVE X2,[POINT 6,X4]
	SETZ X4,
	MOVEI X3,6
	ILDB X1
	CAIN "."
	 JRST .+5
	JUMPE .+4
	SUBI " "
	IDPB X2
	SOJG X3,.-6
	CAME X4,1(IO)
	 JRST LOCFI1
LOCFI4:	MOVE X1,(IO)
	MOVEM X1,LCLFN1
	MOVE X1,1(IO)
	MOVEM X1,LCLFN2
LOCFI5:	CALLR LOCOI
	 RETURN
	.CLOSE
	ENDR SKIP,1

; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI:	BEGINR <IO>
	CALLR LOCC
	SETO X1,
	CAMN X1,FSBUF
	 JRST LOCNI0
	CAMN X1,ESBUF
	 JRST LOCNI0
	RETURN SKIP,1
LOCNI0:	MOVE IO,DIRBLK+1
	ADDI IO,DIRBLK
	CAIN IO,DIRBLK+2000
	 RETURN SKIP,1
	MOVEI X1,5
	ADDM X1,DIRBLK+1
	SETO X1,
	CAME X1,FSBUF
	 JRST LOCNI1
	CAME X1,ESBUF
	 JRST LOCNI2
	JRST LOCNI3
LOCNI1:	MOVE X1,[POINT 7,FSBUF]
	MOVE X2,[POINT 6,X4]
	MOVEI X3,6
	SETZ X4,
	ILDB X1
	CAIN "."
	 JRST .+5
	JUMPE .+4
	SUBI " "
	IDPB X2
	SOJG X3,.-6
	CAMN X4,(IO)
	 JRST LOCNI3
	JRST LOCNI0
LOCNI2:	MOVE X1,[POINT 7,ESBUF]
	MOVE X2,[POINT 6,X4]
	MOVEI X3,6
	SETZ X4,
	ILDB X1
	CAIN "."
	 JRST .+5
	JUMPE .+4
	SUBI " "
	IDPB X2
	SOJG X3,.-6
	CAME X4,1(IO)
	 JRST LOCNI0
LOCNI3:	MOVE X1,(IO)
	MOVEM X1,LCLFN1
	MOVE X1,1(IO)
	MOVEM X1,LCLFN2
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BII
		MOVEI LCI
		[('DSK')]
		LCLFN1
		LCLFN2
		SETZ LCLSNM]
	 JRST LOCNI0
	SKIPN GBUF1
	 JRST LOCNI4
	MOVE X1,[POINT 6,LCLFN1]
	MOVEI X2,6
	MOVE X3,[POINT 7,FBUF]
	ILDB X4,X1
	SKIPE X4
	 ADDI X4,40
	IDPB X4,X3
	SOJG X2,.-4
LOCNI4:	SKIPN GBUF2
	 JRST LOCNI5
	MOVE X1,[POINT 6,LCLFN2]
	MOVEI X2,6
	MOVE X3,[POINT 7,EBUF]
	ILDB X4,X1
	SKIPE X4
	 ADDI X4,40
	IDPB X4,X3
	SOJG X2,.-4
LOCNI5:	.IOT TTO,[" "]
	.IOT TTO,["("]
	TSOUT <FBUF>
	.IOT TTO,["."]
	TSOUT <EBUF>
	.IOT TTO,[")"]
	.IOT TTO,[15]
	.IOT TTO,[12]
	ENDR

; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO:	BEGINR <IO>
	SETZ X1,
	SETO X2,
	CAMN X2,FSBUF
	 TRO X1,400000
	CAMN X2,ESBUF
	 TRO X1,200000
	JUMPE X1,RETN(0)
	MOVE X2,[POINT 7,ABUF]
	MOVE X3,[POINT 7,FSBUF]
	TRNE X1,400000
	 HRRI X3,FBUF
	ILDB X4,X3
	CAIN X4," "
	 SETZ X4,
	IDPB X4,X2
	JUMPN X4,.-4
	SKIPN ESBUF
	 JRST LOCNOO
	MOVEI X4,"."
	DPB X4,X2
	MOVE X3,[POINT 7,ESBUF]
	TRNE X1,200000
	 HRRI X3,EBUF
	ILDB X4,X3
	CAIN X4," "
	 SETZ X4,
	IDPB X4,X2
	JUMPN X4,.-4
LOCNOO:	MOVEI IO,ABUF
	CALLR LUTFN
	.IOT TTO,[" "]
	.IOT TTO,["("]
	TSOUT ABUF
	.IOT TTO,[")"]
	.IOT TTO,[15]
	.IOT TTO,[12]
	ENDR
>
; (((↑↑↑)))

SUBTTL	System Dependent Routines for TOPS-10

; (((TOPS-10)))
IFE F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	MOVE	0,[SIXBIT/DFTP/]
	SETNAM	0,
	OPEN	0,[	200	; TURN OFF TTY ECHOING
			SIXBIT	/TTY/
			0]
	 THUD
	MOVE	0,[SIXBIT/DSK/]
	MOVEM	0,LFCHAS+1
	GETPPN	0,
	MOVEM	0,LFIPPN
	CALLR	ICP
	ENDR

; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL:	BEGINR	<IO,UTIL>
	MSTIME	X1,
	IDIVI	X1,↑D1000
	MOVEM	X1,NTIME
	MOVE	IO,[-GET$F,,FBUF]
	CALLR	NUTFB
	 RETURN
	MOVEI	IO,GET$F
	MOVEM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<FBUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[GET$E,,EBUF]
	CALLR	NUTFB
	MOVEI	IO,GET$E
	ADDM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<EBUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[GET$D,,ABUF]
	CALLR	NUTFB
	MOVEI	IO,GET$D
	ADDM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<ABUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[POINT 7,ABUF]
	CALLR	LUTTSN
	DPB	IO,[001400,,LFILE+2]
	LSH	IO,-14
	DPB	IO,[170300,,LFILE+1]
	DPB	UTIL,[141300,,LFILE+2]
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	AOS	NSIZE
	MOVE	X1,ABUF
	ADDM	X1,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	AOS	NSIZE
	MOVE	X1,ABUF
	ADDM	X1,NSUM
	SKIPLE	X1
	 MOVE	X1,LFCHAS
	SKIPGE	X1
	 MOVN	X1,X1
	DPB	X1,[270400,,LFILE+2]
	ENDR	SKIP,1

; GETDAT -- GET-RETRIEVE FILE DATA
GETDAT:	BEGINR	<IO,UTIL,FLAG>
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	FLAG,ABUF
	JUMPE	FLAG,GETD2
	ADDM	FLAG,NSUM
	AOS	NSIZE
	ADDM	FLAG,NSIZE
	SETZ	UTIL,
	SKIPE	FLAGFE
	 JRST	GETD3
	OUT	LFCHAN,
	 JRST	.+2
	THUD
GETD1:	CAIGE	FLAG,SIZBLK
	 HRLI	IO,(FLAG)
	CAIL	FLAG,SIZBLK
	 HRLI	IO,SIZBLK
	HRR	IO,LFOBUF+1
	ADDI	IO,1
	CALLR	NUTFB
	CAIGE	FLAG,SIZBLK
	 MOVEI	IO,(FLAG)
	CAIL	FLAG,SIZBLK
	 MOVEI	IO,SIZBLK
	SUBI	FLAG,(IO)
	HRRZ	X1,LFOBUF+1
	ADDM	IO,LFOBUF+1
	ADDI	X1,(IO)
	ADD	UTIL,(X1)
	SOJ	X1,
	SOJG	IO,.-2
	OUT	LFCHAN,
	 JRST	.+2
	THUD
	JUMPG	FLAG,GETD1
GETD2:	ADDM	UTIL,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	IO,ABUF
	ADDM	IO,NSUM
	AOS	NSIZE
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	IO,ABUF
	ADDM	IO,NSUM
	AOS	NSIZE
	CAMN	IO,UTIL
	 JRST	GETD4
	TSOUT	<[ASCIZ/ (File Checksum Error)/],CRLF>
	JRST	GETD4
IFE F.SAIL,<
GETD3:	ADDM	UTIL,NSUM
	SETZ	UTIL,
	SKIPE	DDIBUF+2
	 JRST	.+6
GETD$:	STATZ	DDCHAN,020000
	 JRST	GETD4
	IN	DDCHAN,
	 JRST	.+2
	JRST	GETD4
	HRRZ	X1,DDIBUF+1
	MOVE	X2,DDIBUF+2
	ADDI	X1,(X2)
	ADD	UTIL,(X1)
	SOJ	X1,
	SOJG	X2,.-2
	ADDM	UTIL,NSUM
	SETZ	UTIL,
	SETZM	DDIBUF+2
	JRST	GETD$
>
IFN F.SAIL,<
GETD3:	IN	DDCHAN,
	 JRST	GETD3
>
GETD4:	MSTIME	X1,
	IDIVI	X1,↑D1000
	MOVE	X2,NTIME
	SUB	X1,X2
	MOVEM	X1,NTIME
	ENDR

; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL:	BEGINR	<IO,BP,UTIL>
	OUT	DDCHAN,
	 JRST	.+2
	THUD
	MSTIME	X1,
	IDIVI	X1,↑D1000
	MOVEM	X1,NTIME
	HRR	BP,DDOBUF+1
	HRLI	BP,010700
	MOVE	UTIL,[POINT 7,FBUF]
	SCOPY	(UTIL,BP)
	MOVE	BP,UTIL
	MOVE	UTIL,[POINT 7,EBUF]
	SCOPY	(UTIL,BP)
	MOVE	BP,UTIL
	LDB	IO,[001400,,LFILE+2] ; CREATION DATE
	LDB	UTIL,[170300,,LFILE+1]
	LSH	UTIL,14
	IORI	IO,(UTIL)
	LDB	UTIL,[141300,,LFILE+2] ; CREATION TIME
	CALLR	LUTTNS
	DATE	IO,
	MSTIME	X1,
	IDIVI	X1,<↑D1000*↑D60>
	MOVE	UTIL,X1
	CALLR	LUTTNS
	HRLI	BP,004400
	MOVE	UTIL,VBUF
	IDPB	UTIL,BP
	CALLR	LOCS
	IDPB	IO,BP
	LDB	UTIL,[270400,,LFILE+2] ; DATA MODE
	SKIPE	UTIL
	 MOVN	UTIL,UTIL
	IDPB	UTIL,BP
	HRRZ	IO,DDOBUF+1
	MOVEM	BP,DDOBUF+1
	HRRZI	BP,(BP)
	HRRZI	X1,(BP)
	SUBI	BP,-1(IO)
	MOVEM	BP,NSIZE
	SETZ	UTIL,
	ADD	UTIL,(X1)
	SOJ	X1,
	SOJG	BP,.-2
	ADDM	UTIL,NSUM
	OUT	DDCHAN,
	 JRST	.+2
	THUD
	ENDR

; PUTDAT -- PUT-STORE FILE DATA
;
PUTDAT:	BEGINR	<IO,UTIL>
	CALLR	LOCS
	AOS	NSIZE
	ADDM	IO,NSUM
	ADDM	IO,NSIZE
	AOS	DDOBUF+1
	MOVEM	IO,@DDOBUF+1
	OUT	DDCHAN,
	 JRST	.+2
	THUD
	SETZ	UTIL,
PUTD1:	SOSG	LFIBUF+2
	 IN	LFCHAN,
	  JRST	.+2
	   JRST	PUTD2
	ILDB	X1,LFIBUF+1
	ADD	UTIL,X1
	SOSLE	DDOBUF+2
	 JRST	PUTD1A
IFN F.SAIL,<
	MOVEM X1,X1SAVE#
	CALLR NETMSG
	 JRST PUTD3
	MOVE X1,X1SAVE#
>
	OUT	DDCHAN,
	 JRST	PUTD1A
IFN F.SAIL,<THUD>
IFE F.SAIL,<
	STATO	DDCHAN,400000
	 THUD
	JRST	PUTD3
>
PUTD1A:	IDPB	X1,DDOBUF+1
	JRST	PUTD1
PUTD2:	STATO	LFCHAN,20000
	 THUD
	AOS	NSIZE
	ADDM	UTIL,NSUM
	ADDM	UTIL,NSUM
	AOS	DDOBUF+1
	MOVEM	UTIL,@DDOBUF+1
IFE F.SAIL,<
	OUT	DDCHAN,
	 JRST	.+3
	STATO	DDCHAN,400000
	 THUD
>
IFN F.SAIL,<
	OUT	DDCHAN,
	 JRST	.+2
	THUD
>
PUTD3:	MSTIME	X1,
	IDIVI	X1,↑D1000
	MOVE	X2,NTIME
	SUB	X1,X2
	MOVEM	X1,NTIME
	ENDR

; EXAFIL -- EXAMINE FILE... READ AND LIST TO TERMINAL
;
EXAFIL:	BEGINR	<IO,BP,FLAG,UTIL>
	MSTIME	X1,
	IDIVI	X1,↑D1000
	MOVEM	X1,NTIME
	MOVE	IO,[-GET$F,,FBUF]
	CALLR	NUTFB
	 RETURN
	MOVEI	IO,GET$F
	MOVEM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<FBUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[GET$E,,EBUF]
	CALLR	NUTFB
	MOVEI	IO,GET$E
	ADDM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<EBUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[GET$D,,ABUF]
	CALLR	NUTFB
	MOVEI	IO,GET$D
	ADDM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<ABUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	AOS	NSIZE
	MOVE	X1,ABUF
	ADDM	X1,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	AOS	NSIZE
	MOVE	X1,ABUF
	ADDM	X1,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	FLAG,ABUF
	JUMPE	FLAG,EXAF2
	ADDM	FLAG,NSUM
	AOS	NSIZE
	ADDM	FLAG,NSIZE
	SKIPL	DEXA$S
	 JRST	EXAF0
	MOVE	X2,[440700,,FBUF]
	ILDB	X1,X2
	CAILE	X1," "
	 JRST	.-2
	SETZ	X1,
	DPB	X1,X2
	MOVE	X2,[440700,,EBUF]
	ILDB	X1,X2
	CAILE	X1," "
	 JRST	.-2
	SETZ	X1,
	DPB	X1,X2
	TSOUT	<[ASCIZ/ [/],FBUF,[ASCIZ/./],EBUF,[ASCIZ/]/],CRLF>
EXAF0:	SETZ	UTIL,
EXAF1:	CAIGE	FLAG,SIZBLK
	 HRLI	IO,(FLAG)
	CAIL	FLAG,SIZBLK
	 HRLI	IO,SIZBLK
	HRRI	IO,EXABUF
	CALLR	NUTFB
	CAIGE	FLAG,SIZBLK
	 MOVEI	IO,(FLAG)
	CAIL	FLAG,SIZBLK
	 MOVEI	IO,SIZBLK
	SUBI	FLAG,(IO)
	PUSH	STAK,IO
	IMULI	IO,5
	MOVE	BP,[440700,,EXABUF]
	CALLR	DEXA$
	POP	STAK,IO
	HRRZI	X1,<EXABUF-1>
	ADDI	X1,(IO)
	ADD	UTIL,(X1)
	SOJ	X1,
	SOJG	IO,.-2
	JUMPG	FLAG,EXAF1
EXAF2:	ADDM	UTIL,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	IO,ABUF
	ADDM	IO,NSUM
	AOS	NSIZE
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	IO,ABUF
	ADDM	IO,NSUM
	AOS	NSIZE
	CAMN	IO,UTIL
	 JRST	EXAF3
	TSOUT	<[ASCIZ/ (File Checksum Error)/],CRLF>
EXAF3:	MSTIME	X1,
	IDIVI	X1,↑D1000
	MOVE	X2,NTIME
	SUB	X1,X2
	MOVEM	X1,NTIME
	ENDR	SKIP,1

; TOPS-10 ICP:		1) SET CONNECTION SOCKETS IN LISTENING STATE
;			2) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			3) OPEN CONNECTION SOCKETS
;				A) EVEN - RECEIVE
;				B) ODD - SEND
;
ICP:	BEGINR	<IO,UTIL,FLAG>
; (((NOT SAIL)))
IFE F.SAIL,<
ICPBEG:	SETZM	ICPBLK+.IBDEV
	SETZM	DCIBLK+.IBDEV
	SETZM	DCOBLK+.IBDEV
	SETZM	DCIBLK+.IBRMT
	SETZM	DCOBLK+.IBRMT
	MOVE	IO,LINP		; LISTEN ON INPUT SOCKET
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	.+2
	JRST	ICPICP
	MOVE	IO,DCIBLK+.IBERR
	CAIE	IO,.IESKT
	 JRST	ICPEIL
	MOVE	IO,PWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	LDB	X4,[221100,,WRKBLK+.IBHST] ; NUMBER OF IMP DEVICES
	GETPPN	UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,102
	SETZ	X3,
	SETZ	FLAG,
ICPRDV:	MOVE	IO,[SIXBIT/IMP/]	; RESET DEVICE(S) USED
	MOVEM	IO,WRKBLK+.IBDEV
	MOVEI	X1,(X3)
	IDIVI	X1,10
	JUMPE	X1,ICPRD1
	ADDI	X1,20
	ADDI	X2,20
	DPB	X1,[140600,,WRKBLK+.IBDEV]
	DPB	X2,[060600,,WRKBLK+.IBDEV]
	JRST	ICPRD2
ICPRD1:	ADDI	X2,20
	DPB	X2,[140600,,WRKBLK+.IBDEV]
ICPRD2:	SETZM	WRKBLK+.IBLCL
	MOVE	IO,SWRK
	CALL	IO,[SIXBIT/IMPUUO/]	; TEST STATUS OF SOCKET
	 JRST	ICPRD3
	HRRZ	IO,WRKBLK+.IBHST	; FOREIGN HOST
	CAIE	IO,DCHOST
	 JRST	ICPRD3
	PJOB	X1,
	HLRZ	X2,WRKBLK+.IBSTT	; OWNING JOB
	CAIE	X2,(X1)
	 JRST	ICPRD3
	MOVE	IO,WRKBLK+.IBLCL
	CAMN	IO,UTIL		; DATALANGUAGE SOCKET(S)
	 JRST	ICPCLS
	SUBI	IO,2
	CAMN	IO,UTIL		; INPUT DATA SOCKET
	 JRST	ICPCLI
ICPRD3:	MOVEI	IO,1			; OUTPUT DATA SOCKET
	MOVEM	IO,WRKBLK+.IBLCL
	MOVE	IO,SWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	HRRZ	IO,WRKBLK+.IBHST
	CAIE	IO,DCHOST
	 JRST	ICPRD4
	PJOB	X1,
	HLRZ	X2,WRKBLK+.IBSTT
	CAIE	X2,(X1)
	 JRST	ICPRD4
	MOVE	IO,WRKBLK+.IBLCL
	SUBI	IO,3
	CAMN	IO,UTIL
	 JRST	ICPCLO
ICPRD4:	ADDI	X3,1
	CAIGE	X3,(X4)
	 JRST	ICPRDV
	JUMPN	FLAG,ICPBEG
	TTCALL	3,[ASCIZ/ (Connections in use)/]
	EXIT
ICPCLS:	MOVE	IO,CWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	MOVEI	IO,1
	MOVEM	IO,WRKBLK+.IBLCL
	MOVE	IO,SWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	MOVE	IO,CWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ/ [Restarting]
/]
	SETO	FLAG,
	JRST	ICPRDV
ICPCLI:	MOVE	IO,CWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ/ (Retrieve interrupted:  connection closed)
/]
	JRST	ICPRDV
ICPCLO:	MOVE	IO,CWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ/ (Store interrupted:  connection closed)
/]
	JRST	ICPRDV
ICPICP:	MOVE	IO,DCIBLK+.IBDEV	; GET DEVICE NAME
	MOVEM	IO,DCOBLK+.IBDEV	;   AND COPY IT FOR DUPLEX
	MOVEM	IO,DCCHAS+1
	MOVE	IO,LOUT		; LISTEN ON OUTPUT SOCKET
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPEOL
	MOVE	IO,OICP
	CALL	IO,[SIXBIT/IMPUUO/]	; OPEN CONNECTION
	 JRST	ICPEC
	MOVE	IO,ICPBLK+.IBDEV	; GET DEVICE NAME
	MOVEM	IO,ICCHAS+1
	OPEN	DCCHAN,ICCHAS		; OPEN AS STANDARD DEVICE
	 JRST	ICPEF
	IN	DCCHAN,
	 JRST	.+2
	JRST	ICPET
	MOVE	IO,ICPBUF+1
	MOVE	IO,1(IO)		; GET THE SOCKET NUMBER
	LSH	IO,-4		; RIGHT JUSTIFY 32 BITS
	MOVEM	IO,DCOBLK+.IBRMT
	AOJ	IO,
	MOVEM	IO,DCIBLK+.IBRMT
	RELEAS	DCCHAN,		; CLOSE AS STANDARD DEVICE
	MOVE	IO,CICP
	CALL	IO,[SIXBIT/IMPUUO/]	; CLOSE CONNECTION
	 JRST	ICPEC
	MOVE	IO,OINP		; OPEN INPUT SOCKET
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	NETEIC
	MOVE	IO,OOUT		; OPEN OUTPUT SOCKET
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	NETEOC
	OPEN	DCCHAN,DCCHAS
	 JRST	NETECF
	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT
	MOVE	IO,PWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	QUIT
	HRRZ	IO,WRKBLK+.IBHST
	MOVEM	IO,LHOST
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
; POSITIONS IN MTAPE BLOCK

STLOC==1	; STATUS BITS RETURNED HERE
LSLOC==2	; LOCAL SOCKET
WFLOC==3	; WAIT FLAG
BSLOC==4	; BYTE SIZE LOCATION
FSLOC==5	; FOREIGN SOCKET
HLOC==6		; HOST NUMBER

ERRBTS==763600	; I/O ERROR BITS

ICPBEG:	; Tovar says this is the right thing to do - MRC
	PJOB X2,		; GET JOB #
	TIMER X1,		; GET A "RANDOM" VALUE
	ANDI X1,377770		; BUT INSURE ONLY A HALFWORD
	MOVSS X4,X2		; RECEIVE SOCKET
	ADDI X2,(X1)		; THIS BARFUCIOUS CROCK IS BECAUSE SAIL
	ADDI X4,(X1)		; DOESN'T ALWAYS RESET SOCKETS FAST ENOUGH
				; AND ALL SORTS OF RANDOM CRAP HAPPENS.
	ADDI X4,1		; TRANSMIT SOCKET
	MOVEI X1,13		; SAIL'S HOST ADDRESS NUMBER
	MOVEM X1,LHOST	; SAVE IT AWAY
	INIT DCCHAN,17
	SIXBIT /IMP/
	0
	 JRST ICPLUZ
	SETZM CONECB
	MOVEM X2,CONECB+LSLOC
	MOVEI X3,DCHOST
	MOVEM X3,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI X3,40
	MOVEM X3,CONECB+BSLOC
	MOVEI X3,DCSOKT
	MOVEM X3,CONECB+FSLOC
	MTAPE DCCHAN,[
		↑D15
		BYTE (6) 2,24,0,12,12
		]		; TIME OUT CLS, RFNM, RFC, AND INPUT
	MTAPE DCCHAN,CONECB
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; NO CONNECTION TO LOGGER
	INPUT DCCHAN,[IOWD 1,FRS#
		0]
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; GOT LOGGER BUT DIDN'T GET SOCKET FROM HIM
	MOVE X3,FRS
	LSH X3,-4
	MOVEM X3,FRS
	ADDI X3,1
	MOVEM X3,FSS#
	ADDI X2,2
	MOVEM X2,LRS#
	ADDI X4,2
	MOVEM X4,LSS#
	MOVE X1,CONECB+LSLOC
	MOVEM X1,TERBLK+LSLOC
	MTAPE DCCHAN,TERBLK	; RELEASE LOGGER
	INIT DCCHAN,1
	SIXBIT /IMP/
	XWD DCOBUF,DCIBUF
	 JRST ICPLUZ
	MTAPE DCCHAN,[
		↑D15
		BYTE (6) 5,24,0,12,0
		]		; TIME OUT CLS, RFNM, AND RFC
	MOVEI X1,↑D8
	DPB X1,[POINT 6,DCIBUF+1,11]
	DPB X1,[POINT 6,DCOBUF+1,11]
	MOVEM X2,CONECB+LSLOC
	MOVEI X3,DCHOST
	MOVEM X3,CONECB+HLOC
	SETZM CONECB+WFLOC
	MOVEI X3,↑D8
	MOVEM X3,CONECB+BSLOC
	MOVE X3,FSS
	MOVEM X3,CONECB+FSLOC
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TRNN X1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO RECEIVE SIDE
	CALLR CLSCHK		; SEE IF WE ARE REALLY OPEN
	 JRST ICPLUZ
	AOS CONECB+LSLOC
	SOS CONECB+FSLOC
	MOVEI X3,↑D8
	MOVEM X3,CONECB+BSLOC
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TRNN X1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO SEND SIDE
	CALLR CLSCHK
	 JRST ICPLUZ
	MOVEI X3,4
	MOVEM X3,CONECB
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TLC X1,300000
	TLCN X1,300000
	 TLNE X1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ
	SOS CONECB+LSLOC
	CALLR CLSCHK
	 JRST ICPLUZ
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TLC X1,300000
	TLCN X1,300000
	 TLNE X1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; LOST WHILE WAITING FOR RECEIVE SIDE TO CONNECT
	CALLR CLSCHK
	 JRST ICPLUZ
	RETURN

; HERE WHEN CONNECTION FAILS

ICPLUZ:	OUTSTR [ASCIZ/? Cannot establish network connection/]
	EXIT
>
; (((↑↑↑)))
	ENDR

; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT:	MOVEI	IO,"Z"-100
	IDPB	IO,DCOBUF+1
	OUT	DCCHAN,
	 JRST	.+1
QUIT01:	INPUT	DCCHAN,
	STATZ	DCCHAN,20000
	 JRST	QUIT02
	SKIPE	FLAGDD
	 CALLR	NUTDD
	JRST	QUIT01
QUIT02:	RELEAS	DCCHAN,		; RELEASE INPUT/OUTPUT DEVICE
QUIT03:	IFE F.SAIL,<
	MOVE	IO,COUT		; CLOSE OUTPUT SOCKET
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	NETEOC
>
QUIT04:	IFE F.SAIL,<
	MOVE	IO,CINP		; CLOSE INPUT SOCKET
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	NETEIC
>
	EXIT

; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
IFE F.SAIL,<
	RELEAS	DDCHAN,
	SETZM	DCDBLK+.IBDEV
	MOVEI	X1,104
	MOVEM	X1,DCDBLK+.IBLCL
	MOVE	X1,DCIBLK+.IBRMT
	ADDI	X1,2
	MOVEM	X1,DCDBLK+.IBRMT
	MOVE	X1,ODAT
	CALL	X1,[SIXBIT/IMPUUO/]
	 JRST	NETOI2
	MOVE	X1,DCDBLK+.IBDEV
	MOVEM	X1,DDCHAS+1
	OPEN	DDCHAN,DDCHAS
	 JRST	NETOI1
	RETURN	SKIP,1
NETOI1:	MOVE	X1,CDAT
	CALL	X1,[SIXBIT/IMPUUO/]
	 JRST	NETOI2
>
IFN F.SAIL,<
	OPEN DDCHAN,DDCHAS
	 JRST NETOI2
	MTAPE DDCHAN,[	15		;ALLOCATE
			1
			0
			0]
	SETZM CONECB
	MOVE X1,LRS
	ADDI X1,2
	MOVEM X1,CONECB+LSLOC
	MOVEI X1,DCHOST
	MOVEM X1,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI X1,↑D36
	MOVEM X1,CONECB+BSLOC
	MOVE X1,FSS
	ADDI X1,2
	MOVEM X1,CONECB+FSLOC
	MTAPE DDCHAN,CONECB
	STATZ DDCHAN,ERRBTS
	 JRST NETOI2
	RETURN SKIP,1
>
NETOI2:	TTCALL	3,[ASCIZ / ?? Network connection OPEN failure ??
/]
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
IFE F.SAIL,<
	RELEAS	DDCHAN,
	SETZM	DCDBLK+.IBDEV
	MOVEI	X1,105
	MOVEM	X1,DCDBLK+.IBLCL
	MOVE	X1,DCOBLK+.IBRMT
	ADDI	X1,2
	MOVEM	X1,DCDBLK+.IBRMT
	MOVE	X1,ODAT
	CALL	X1,[SIXBIT/IMPUUO/]
	 JRST	NETOO2
	MOVE	X1,DCDBLK+.IBDEV
	MOVEM	X1,DDCHAS+1
	OPEN	DDCHAN,DDCHAS
	 JRST	NETOO1
	RETURN	SKIP,1
NETOO1:	MOVE	X1,CDAT
	CALL	X1,[SIXBIT/IMPUUO/]
	 JRST	NETOO2
>
IFN F.SAIL,<
	OPEN DDCHAN,DDCHAS
	 JRST NETOO2
	MTAPE DDCHAN,[	15		; ALLOCATE
			1
			0
			0]
	SETZM CONECB
	MOVE X1,LSS
	ADDI X1,2
	MOVEM X1,CONECB+LSLOC
	MOVEI X1,DCHOST
	MOVEM X1,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI X1,↑D36
	MOVEM X1,CONECB+BSLOC
	MOVE X1,FRS
	ADDI X1,2
	MOVEM X1,CONECB+FSLOC
	MTAPE DDCHAN,CONECB
	STATZ DDCHAN,ERRBTS
	 JRST NETOO2
	RETURN SKIP,1
>
NETOO2:	TTCALL	3,[ASCIZ / ?? Network connection OPEN failure ??
/]
	ENDR

; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
IFE F.SAIL,<
	STATZ	DDCHAN,400000
	 RETURN
>
IFN F.SAIL,<
	MOVEI 3			; TERMINATE CONNECTION
	MOVEM CONECB
	SETOM CONECB+WFLOC	; WAIT FOR CLS REC'VD
	MTAPE DDCHAN,CONECB	; CLOSE IT
>
	RELEAS	DDCHAN,
IFE F.SAIL,<
	MOVE	X1,CDAT
	CALL	X1,[SIXBIT/IMPUUO/]
	 JRST	NETC1
	RETURN
NETC1:	TTCALL	3,[ASCIZ / ?? Network connection CLOSE failure ??
/]
>
	ENDR

; (((SAIL)))
IFN F.SAIL,<
; NETMSG -- HANDLE PENDING MESSAGES
;
NETMSG:	BEGINR	<IO>
	SKIPE FLAGSM			; NETMSG allowed to gobble?
	 RETURN SKIP,1			; no!!
NETMS1:	MOVE	IO,DCIBUF+2		; check for cruft read but still
	CAILE	IO,20			;  not input by dftp
	 JRST	NETM1A			; stuff in buffer still
	HRRZ	IO,DCIBUF		; try another buffer
	HRRZ	IO,(IO)
	SKIPGE	(IO)
	 JRST	NETM1A
	MTAPE	DDCHAN,[10]		; try still in monitor
	 RETURN	SKIP,1
NETM1A:	DCBIN	<IO>
	CAIN	IO,"?"
	 JRST	DEATH
	CAIN	IO,"!"
	 JRST	NETMS2
	CAIE	IO,"+"
	 CAIN	IO,"-"
	  JRST	NETMS3
	CAIN IO,"."
	 JRST NETMS4
	CALLR	RENLIN
	JRST	NETMS1
NETMS2:	CALLR	RENLIP
	JRST	NETMS1
NETMS3:	CALLR	RENLIP
	RETURN
NETMS4:	SETOM FLAGSM
	CALLR RENLIN
	ENDR SKIP,1
>
; (((↑↑↑)))

; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
;   OUT: UTIL
;
NETDSI:	BEGINR
IFN F.SAIL,<MOVE UTIL,LRS
	ADDI UTIL,2>
IFE F.SAIL,<GETPPN UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,104>
	ENDR

; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
;   OUT: UTIL
;
NETDSO:	BEGINR
IFN F.SAIL,<MOVE UTIL,LSS
	ADDI UTIL,2>
IFE F.SAIL,<GETPPN UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,105>
	ENDR

; NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
;
NETFFI:	BEGINR
	SETO	X1,
	CAMN	X1,FSBUF
	 JRST	NETFI0
	CAMN	X1,ESBUF
	 JRST	NETFI0
	JRST	NETFI1
NETFI0:	TTCALL	3,[ASCIZ/ (/]
	TTCALL	3,LUTDSF
	TTCALL	3,[ASCIZ/)
/]
NETFI1:	SKIPN	GBUF1
	 JRST	NETFI2
	MOVE	X1,[POINT 6,LFILE]
	MOVEI	X2,6
	MOVE	X3,[POINT 7,FBUF]
	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,.-4
NETFI2:	SKIPN	GBUF2
	 RETURN
	MOVE	X1,[POINT 6,LFILE+1]
	MOVEI	X2,3
	MOVE	X3,[POINT 7,EBUF]
	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,.-4
	ENDR

; NETWORK UTILITY -- MESSAGE INPUT
;
NUTMI:	BEGINR
	IN	DCCHAN,
	 JRST	.+2
	JRST	NETEIT
	SKIPE	FLAGDD
	 CALLR NUTDD
	ENDR

; NETWORK UTILITY -- MESSAGE OUTPUT
;   IN: X1 -- POINTER TO ASCIZ MESSAGE STRING
;
NUTMO:	BEGINR	<IO,BP>
	SKIPE FLAGDD
	 OUTSTR (X1)
	MOVEI	BP,(X1)
	HRLI	BP,(POINT 7,)
NUTMOL:	ILDB	IO,BP
	JUMPE	IO,RETN(0)
	SKIPE	DCOBUF+2
	 JRST	NUTMOB
NUTMOO:	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT
NUTMOB:	SOS	DCOBUF+2
	IDPB	IO,DCOBUF+1
	JRST	NUTMOL
	ENDR

; NETWORK UTILITY -- DISPLAY DATALANGUAGE
;
NUTDD:	BEGINR	<IO,UTIL>
	MOVE X1,DCIBUF+1
	MOVE UTIL,DCIBUF+2
NUTDDL:	SOJL	UTIL,RETN(0)
	ILDB	IO,X1
	JUMPE	IO,NUTDDL
	TTCALL	1,IO
	JRST	NUTDDL
	ENDR

; NETWORK UTILITY -- FILL A DESIGNATED BUFFER
;   IN: IO -- SIZE OF BUFFER (- IF EOF POSSIBLE),,ADDRESS OF BUFFER
;
NUTFB:	BEGINR
	HLRE	X1,IO
	SKIPGE	X1
	 MOVN	X1,X1
	HRRZI	X2,(IO)
	SKIPE	DDIBUF+2
	 JRST	NUTFB2
NUTFB1:
IFE F.SAIL,<
	SKIPL	IO
	 JRST	NUTFB$
	STATZ	DDCHAN,020000
	 RETURN
	MOVE	X3,DCDBLK+.IBDEV
	MOVEM	X3,WRKBLK+.IBDEV
	MOVE	X3,DCDBLK+.IBLCL
	MOVEM	X3,WRKBLK+.IBLCL
	MOVE	X3,SWRK
	CALL	X3,[SIXBIT/IMPUUO/]
	 JRST	.+3
	LDB	X3,[000600,,WRKBLK+.IBSTT]
	JUMPE	X3,RETN(0)
NUTFB$:
>
	IN	DDCHAN,
	 JRST	NUTFB2
	SKIPL	IO
	 THUD
	STATO	DDCHAN,020000
	 THUD
	RETURN
NUTFB2:	HRRZ	X3,DDIBUF+1
	HRLI	X2,1(X3)
	MOVEI	X3,(X1)
	CAMLE	X3,DDIBUF+2
	 MOVE	X3,DDIBUF+2
	ADDI	X3,-1(X2)
	BLT	X2,(X3)
	CAMG	X1,DDIBUF+2
	 JRST	NUTFB3
	SUB	X1,DDIBUF+2
	MOVEI	X2,1(X3)
	JRST	NUTFB1
NUTFB3:	ADDM	X1,DDIBUF+1
	MOVE	X2,DDIBUF+2
	SUBI	X2,(X1)
	MOVEM	X2,DDIBUF+2
	SKIPL	IO
	 RETURN
	ENDR	SKIP,1

; FATAL NETWORK ERROR MESSAGES
;
; (((NOT SAIL)))
IFE F.SAIL,<
ICPERD:	TTCALL	3,[ASCIZ / ?? Restart failure ??/]
	EXIT
ICPEIL:	TTCALL	3,[ASCIZ / ?? Input socket listen failure ??/]
	EXIT
ICPEOL:	TTCALL	3,[ASCIZ / ?? Output socket listen failure ??/]
	JRST	QUIT04
ICPET:	TTCALL	3,[ASCIZ / ?? ICP failure (transfer) ??/]
	RELEAS	DCCHAN,		; CLOSE AS STANDARD DEVICE
ICPEZ:	MOVE	IO,CICP
	CALL	IO,[SIXBIT/IMPUUO/]	; CLOSE CONNECTION
	 JRST	ICPEC
	JRST	QUIT03
ICPEF:	TTCALL	3,[ASCIZ / ?? ICP failure (file control) ??/]
	JRST	ICPEZ
ICPEC:	TTCALL	3,[ASCIZ / The datacomputer is unavailable/]
	MOVE	0,ICPBLK+.IBERR
	CAIN	0,.IESOF	; SOCKET OPEN FAILURE
	 TTCALL	3,[ASCIZ / (rejecting)/]
	CAIN	0,.IEDWN
	 TTCALL	3,[ASCIZ / (down)/]
	CAIN	0,.IETIM
	 TTCALL	3,[ASCIZ / (timeout)/]
	TTCALL	3,[ASCIZ /.
/]
	MOVE	IO,CICP
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	QUIT03
	JRST	QUIT03
NETEIC:	TTCALL	3,[ASCIZ / ?? Input failure (connection) ??/]
	EXIT
NETEOC:	TTCALL	3,[ASCIZ / ?? Output failure (connection) ??/]
	JRST	QUIT04
NETECF:	TTCALL	3,[ASCIZ / ?? File control failure ??/]
	JRST	QUIT03
>
; (((↑↑↑)))
NETEIT:	TTCALL	3,[ASCIZ / ?? Input failure (transfer) ??/]
	JRST	QUIT
NETEOT:	TTCALL	3,[ASCIZ / ?? Output failure (transfer) ??/]
	JRST	QUIT

; (((SAIL)))
IFE F.SAIL,<
OICP:	.IUCON,,ICPBLK
CICP:	.IUCLS,,ICPBLK
LINP:	.IULSN,,DCIBLK
OINP:	.IUCON,,DCIBLK
CINP:	.IUCLS,,DCIBLK
LOUT:	.IULSN,,DCOBLK
OOUT:	.IUCON,,DCOBLK
COUT:	.IUCLS,,DCOBLK
ODAT:	001000+.IUCON,,DCDBLK	; 60 SEC TIMEOUT 4*2↑(BITS 8-10)
CDAT:	.IUCLS,,DCDBLK
PWRK:	.IULHS,,WRKBLK
SWRK:	.IUSTT,,WRKBLK
CWRK:	.IUCLS,,WRKBLK
>
; (((↑↑↑)))

;(((SAIL)))
IFN F.SAIL,< 
; CLSCHK - ROUTINE TO CHECK IF SOCKET CLOSED ON ME

CLSCHK:	BEGINR
	MTAPE DCCHAN,STTBLK
	MOVE X1,STTBLK+1
	IOR X1,STTBLK+2
	STATO DCCHAN,ERRBTS
	TLNN X1,060000
	 RETURN SKIP,1
	ENDR
>
;(((↑↑↑↑)))

; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR <IO>
	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS	; INITIALIZE LOCAL CHANNEL
	 JRST	LOCOI1
IFE F.SAIL,<
	LOOKUP	LFCHAN,LFILEB	; PREPARE FILE FOR INPUT
>
IFN F.SAIL,<	; SAIL DOES NOT HAVE EXTENDED LOOKUP
	MOVE IO,LFIPPN
	MOVEM IO,LFILE+3		; MUST CLEAR FOR SAIL PPN'S
	LOOKUP LFCHAN,LFILE	; PREPARE FILE FOR INPUT
>
	 JRST	LOCOI2
	RETURN	SKIP,1
LOCOI1:	TTCALL	3,[ASCIZ / ?? Local channel OPEN failure ??
/]
	RELEAS	LFCHAN,
	RETURN
LOCOI2:	TTCALL	3,[ASCIZ / (Local file not found)
/]
	RELEAS	LFCHAN,
	ENDR

; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR	<IO,<IO+1>>
	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS
	 JRST	LOCOO2
	MOVE	IO,<LFILE+1>
	MOVE	<IO+1>,<LFILE+2>
	SETZM LFILE+3
	LOOKUP	LFCHAN,LFILE
	 JRST	LOCOO1
	TAIN	<[ASCIZ / [Old Local File][Confirm]/]>
	 JRST	.+3
	 JRST	.+2
	JRST	LOCOO1
	RELEAS	LFCHAN,
	RETURN
LOCOO1:	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS	; INITIALIZE LOCAL CHANNEL
	 JRST	LOCOO2
	MOVEM	IO,<LFILE+1>
	MOVEM	<IO+1>,<LFILE+2>
IFE F.SAIL,<
	ENTER	LFCHAN,LFILEB	; PREPARE FILE FOR OUTPUT
>
IFN F.SAIL,<	; NO EXTENDED ENTER ON SAIL
	MOVE IO,LFIPPN
	MOVEM IO,LFILE+3
	ENTER LFCHAN,LFILE	; PREPARE FILE FOR OUTPUT
>
	 JRST	LOCOO2
	RETURN	SKIP,1
LOCOO2:	TTCALL	3,[ASCIZ/ (Local file creation failure)
/]
	RELEAS	LFCHAN,
	ENDR

; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	SKIPE	FLAGFE
	 RETURN
	RELEAS	LFCHAN,
	ENDR

; LOCS -- LOCAL (FILE) SIZE
;   OUT: IO -- SIZE IN WORDS
;
LOCS:	BEGINR
IFE F.SAIL,<
	MOVE	IO,LFILE+3	; SIZE IN WORDS FROM EXTENDED LOOKUP
>
IFN F.SAIL,<	; SAIL HAS A FULL WORD SWAPPED -LENGTH(HOW SEXY!!!)
	MOVS IO,LFILE+3		; - LENGTH
	MOVNS IO		; + LENGTH
>		; DON'T YOU WISH BOTTOMS-10 WERE SMART LIKE THIS?
	ENDR

; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI:	BEGINR	<IO>
	SETZM	GBUF1
	LDB	X1,[350700,,FBUF]
	CAIN	X1,"*"
	 SETOM	GBUF1
	SETZM	GBUF2
	LDB	X1,[350700,,EBUF]
	CAIN	X1,"*"
	 SETOM	GBUF2
	SETO	X1,
	CAMN	X1,FSBUF
	 JRST	LOCFI0
	CAMN	X1,ESBUF
	 JRST	LOCFI0
	JRST	LOCFI5
LOCFI0:	SETZM	LUTDSP
LOCFI1:	CALLR	LUTDS
	 JRST	.+2
	JRST	.+3
	TTCALL	3,[ASCIZ/ (No Such File)
/]
	RETURN
	SETO	X1,
	CAME	X1,FSBUF
	 JRST	LOCFI2
	CAME	X1,ESBUF
	 JRST	LOCFI3
	JRST	LOCFI4
LOCFI2:	MOVE	X1,[POINT 7,FSBUF]
	MOVE	X2,[POINT 7,LUTDSF]
	ILDB	X3,X1
	ILDB	X4,X2
	JUMPE	X3,.+4
	CAIN	X3,(X4)
	 JRST	.-4
	JRST	LOCFI1
	JUMPE	X4,LOCFI4
	CAIN	X4,"."
	 JRST	LOCFI4
	JRST	LOCFI1
LOCFI3:	MOVE	X1,[POINT 7,ESBUF]
	MOVE	X2,[POINT 7,LUTDSF]
	ILDB	X4,X2
	JUMPE	X4,.+4
	CAIE	X4,"."
	 JRST	.-3
	ILDB	X4,X2
	ILDB	X3,X1
	JUMPE	X3,.+4
	CAIN	X3,(X4)
	 JRST	.-4
	JRST	LOCFI1
	JUMPE	X4,LOCFI4
	JRST	LOCFI1
LOCFI4:	HRRZI	IO,LUTDSF
	CALLR	LUTFN
LOCFI5:	CALLR	LOCOI
	 RETURN
	CALLR	LOCC
	ENDR	SKIP,1

; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI:	BEGINR	<IO>
	CALLR	LOCC
	SETO	X1,
	CAMN	X1,FSBUF
	 JRST	LOCNI0
	CAMN	X1,ESBUF
	 JRST	LOCNI0
	RETURN	SKIP,1
LOCNI0:	CALLR	LUTDS
	 RETURN	SKIP,1
	SETO	X1,
	CAME	X1,FSBUF
	 JRST	LOCNI1
	CAME	X1,ESBUF
	 JRST	LOCNI2
	JRST	LOCNI3
LOCNI1:	MOVE	X1,[POINT 7,FSBUF]
	MOVE	X2,[POINT 7,LUTDSF]
	ILDB	X3,X1
	ILDB	X4,X2
	JUMPE	X3,.+4
	CAIN	X3,(X4)
	 JRST	.-4
	JRST	LOCNI0
	JUMPE	X4,LOCNI3
	CAIN	X4,"."
	 JRST	LOCNI3
	JRST	LOCNI0
LOCNI2:	MOVE	X1,[POINT 7,ESBUF]
	MOVE	X2,[POINT 7,LUTDSF]
	ILDB	X4,X2
	JUMPE	X4,.+4
	CAIE	X4,"."
	 JRST	.-3
	ILDB	X4,X2
	ILDB	X3,X1
	JUMPE	X3,.+4
	CAIN	X3,(X4)
	 JRST	.-4
	JRST	LOCNI0
	JUMPE	X4,LOCNI3
	JRST	LOCNI0
LOCNI3:	HRRZI	IO,LUTDSF
	CALLR	LUTFN
	CALLR	LOCOI
	 JRST LOCNI0
	TTCALL	3,[ASCIZ/ (/]
	TTCALL	3,LUTDSF
	TTCALL	3,[ASCIZ/)
/]
	SKIPN	GBUF1
	 JRST	LOCNI4
	MOVE	X1,[POINT 6,LFILE]
	MOVEI	X2,6
	MOVE	X3,[POINT 7,FBUF]
	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,.-4
LOCNI4:	SKIPN	GBUF2
	 RETURN
	MOVE	X1,[POINT 6,LFILE+1]
	MOVEI	X2,3
	MOVE	X3,[POINT 7,EBUF]
	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,.-4
	ENDR

; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO:	BEGINR	<IO>
	SETZ	X1,
	SETO	X2,
	CAMN	X2,FSBUF
	 TRO	X1,400000
	CAMN	X2,ESBUF
	 TRO	X1,200000
	JUMPE	X1,RETN(0)
	MOVE	X2,[POINT 7,ABUF]
	MOVE	X3,[POINT 7,FSBUF]
	TRNE	X1,400000
	 HRRI	X3,FBUF
	ILDB	X4,X3
	CAIN	X4," "
	 SETZ	X4,
	IDPB	X4,X2
	JUMPN	X4,.-4
	SKIPN	ESBUF
	 JRST	LOCNO0
	MOVEI	X4,"."
	DPB	X4,X2
	MOVE	X3,[POINT 7,ESBUF]
	TRNE	X1,200000
	 HRRI	X3,EBUF
	ILDB	X4,X3
	CAIN	X4," "
	 SETZ	X4,
	IDPB	X4,X2
	JUMPN	X4,.-4
LOCNO0:	MOVEI	IO,ABUF
	CALLR	LUTFN
	TTCALL	3,[ASCIZ/ (/]
	TTCALL	3,ABUF
	TTCALL	3,[ASCIZ/)
/]
	ENDR

; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IO -- POINTER TO ASCIZ STRING
;
LUTFN:	BEGINR	<IO,BP,UTIL>
	HRRI	BP,(IO)
	HRLI	BP,(POINT 7,)
	SETZM	LFILE		; CLEAR OLD FILE NAME
	SETZM	LFILE+1		;   AND EXTENSION
	SETZM	LFILE+2
IFN F.SAIL,<SETZM LFILE+3>
	MOVEI	X1,LUTFNT	; INITIALIZE XCT PNTR
	MOVEI	X2,LFILE	; SET DESTINATION OF IOR
	SETZ	UTIL,
LUTFN1:	ILDB	IO,BP
	JUMPE	IO,RETN(0)
	CAIN	IO,"."	; PREPARE FOR FILE EXTENSION IF "."
	 JRST	LUTFN2
	CAILE	UTIL,5
	 JRST	LUTFN1
	ADDI	IO,40	; CONVERT TO SIXBIT BY ADDITION
	ANDI	IO,77	;   AND REMOVAL OF HIGH BITS
	XCT	(X1)		; EXECUTE THE PROPER ROTATE
	IORM	IO,(X2)	; IOR RESULT INTO FILE OR FILE+1
	AOJ	X1,		; INCREMENT THE XCT PNTR
	AOJA	UTIL,LUTFN1
LUTFN2:	CAIN	X2,LFILE+1
	 JRST	RETN(0)		; IGNORE MULTIPLE EXTENSIONS
	MOVEI	X1,LUTFNT	; RESET PNTRS FOR EXTENSION
	MOVEI	X2,LFILE+1
	MOVEI	UTIL,3
	JRST	LUTFN1
LUTFNT:	ROT	IO,-6	; HIGH ORDER
	ROT	IO,-14
	ROT	IO,22
	ROT	IO,14
	ROT	IO,6
	ROT	IO,0		; LOW ORDER
	ENDR

; LUTDS -- LOCAL UTILITY: DIRECTORY SCAN
;
LUTDS:	BEGINR
	SKIPN	LUTDSP
	 JRST	LUTDSS
LUTDS1:	JSP X1,LUTDSI
	JUMPE X2,[	JSP X1,LUTDSI
			; (((SAIL)))
			IFN F.SAIL,<
			REPEAT ↑D14,<JSP X1,LUTDSI>
			>
			; (((↑↑↑)))
			JRST LUTDS1]	; IGNORE HOLES IN DIRECTORY
	MOVE X3,[POINT 7,LUTDSF]
LUTDS2:	SETZ X1,
	LSHC X1,6
	ADDI X1," "
	IDPB X1,X3
	JUMPN X2,LUTDS2
	MOVEI X1,"."
	IDPB X1,X3
	JSP X1,LUTDSI
	ANDCMI X2,-1
LUTDS3:	SETZ X1,
	LSHC X1,6
	ADDI X1," "
	IDPB X1,X3
	JUMPN X2,LUTDS3
	SETZ X1,
	IDPB X1,X3
; (((SAIL)))
IFN F.SAIL,<
REPEAT ↑D14,<JSP X1,LUTDSI>		;IGNORE EXTRA SAIL UFD CRUFT
>
; (((↑↑↑)))
	RETURN	SKIP,1
LUTDSI:	SOSG LDIBUF+2
	 IN LDCHAN,
	  CAIA
	   JRST LUTDSD
	ILDB X2,LDIBUF+1
	JRST (X1)
LUTDSS:	RELEAS	LDCHAN,
	MOVE	X1,LFIPPN
	MOVEM	X1,LDIR
	MOVE	X1,LFCHAS+1
	MOVEM	X1,LDCHAS+1
	MOVE	X1,[SIXBIT/UFD/]
	MOVEM	X1,LDIR+1
	SETZM	LDIR+2
IFE F.SAIL,<MOVE X1,[1,,1]>
IFN F.SAIL,<MOVE X1,[SIXBIT/  1  1/]>
	MOVEM	X1,LDIR+3
	OPEN	LDCHAN,LDCHAS
	 JRST	LUTDSE
	LOOKUP	LDCHAN,LDIR
	 JRST	LUTDSE
	SETOM LUTDSP
	JRST LUTDS1
LUTDSD:	STATO	LDCHAN,20000
LUTDSE:	 TTCALL	3,[ASCIZ/ ?? Local directory failure ??
/]
	RELEAS	LDCHAN,
	ENDR

; LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
;   IN: IO -- DATE INTEGER
;	UTIL -- TIME INTEGER
;	BP -- BYTE POINTER TO DESTINATION STRING
;   OUT: BP -- UPDATED BYTE POINTER
;
LUTTNS:	BEGINR
	MOVE	X1,IO
	IDIVI	X1,↑D31
	MOVEI	X3,(X1)
	MOVEI	X1,1(X2)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	MOVEI	X1,"-"
	IDPB	X1,BP
	MOVEI	X1,(X3)
	IDIVI	X1,↑D12
	MOVEI	X3,(X1)
	HRRI	X1,LUTTM(X2)
	HRLI	X1,(POINT 7,)
	SCOPY	(X1,BP)
	MOVEI	X1,"-"
	IDPB	X1,BP
	MOVEI	X1,↑D64(X3)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	MOVEI	X1," "
	IDPB	X1,BP
	MOVE	X1,UTIL
	IDIVI	X1,↑D60
	MOVEI	X3,(X2)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	MOVEI	X1,":"
	IDPB	X1,BP
	MOVEI	X1,(X3)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	SETZ	X1,
	IDPB	X1,BP
	ENDR

; LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
;   IN: IO -- ADDRESS OF TIME STRING
;   OUT: IO -- DATE INTEGER
;	 UTIL -- TIME INTEGER
;
LUTTSN:	BEGINR	<BP>
	MOVE	BP,IO
	SETZ	IO,
	SETZ	UTIL,
	ILDB	X1,BP
	CAIL	X1,"0"
	 CAILE	X1,"9"
	  RETURN
	MOVEI	X4,-"0"(X1)
	IMULI	X4,↑D10
	ILDB	X1,BP
	ADDI	X4,-"0"(X1)
	ILDB	X1,BP
	CAIE	X1,"-"
	 RETURN
	MOVE	X3,[POINT 7,X2]
	SETZ	X2,
	ILDB	X1,BP
	IDPB	X1,X3
	ILDB	X1,BP
	IDPB	X1,X3
	ILDB	X1,BP
	IDPB	X1,X3
	MOVEI	X3,↑D11
	CAMN	X2,LUTTM(X3)
	 JRST	.+3
	SOJGE	X3,.-2
	RETURN
	ILDB	X1,BP
	CAIE	X1,"-"
	 RETURN
	ILDB	X1,BP
	MOVEI	X2,-"0"(X1)
	IMULI	X2,↑D10
	ILDB	X1,BP
	ADDI	X2,-"0"(X1)
	SUBI	X2,↑D64
	IMULI	X2,↑D12
	ADDI	X2,(X3)
	IMULI	X2,↑D31
	ADDI	X2,-1(X4)
	ILDB	X1,BP
	CAIE	X1," "
	 RETURN
	ILDB	X1,BP
	MOVEI	X3,-"0"(X1)
	IMULI	X3,↑D10
	ILDB	X1,BP
	ADDI	X3,-"0"(X1)
	IMULI	X3,6
	ILDB	X1,BP
	CAIE	X1,":"
	 RETURN
	ILDB	X1,BP
	ADDI	X3,-"0"(X1)
	IMULI	X3,↑D10
	ILDB	X1,BP
	ADDI	X3,-"0"(X1)
	MOVE	IO,X2
	MOVE	UTIL,X3
	ENDR

; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LUTTM:	ASCII	/JAN/
	ASCII	/FEB/
	ASCII	/MAR/
	ASCII	/APR/
	ASCII	/MAY/
	ASCII	/JUN/
	ASCII	/JUL/
	ASCII	/AUG/
	ASCII	/SEP/
	ASCII	/OCT/
	ASCII	/NOV/
	ASCII	/DEC/

; OOPS -- THE IMPOSSIBLE HAS HAPPENED
;
OOPS:	MOVE	IO,[IN DDCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERDD
	MOVE	IO,[OUT DDCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERDD
	MOVE	IO,[IN LFCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERLF
	MOVE	IO,[OUT LFCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERLF
	TTCALL	3,[ASCIZ/ ?? Impossible event at /]
	MOVEI	IO,-1(FLAG)
	TNOUT	(IO,10)
	TTCALL	3,[ASCIZ / ??/]
	EXIT
IOERDD:	GETSTS	DDCHAN,ABUF
	JRST	.+2
IOERLF:	GETSTS	LFCHAN,ABUF
	TTCALL	3,[ASCIZ/ ?? Data error at /]
	MOVEI	IO,-3(FLAG)
	TNOUT	(IO,10)
	TTCALL	3,[ASCIZ/ with status /]
	MOVE	IO,ABUF
	TNOUT	(IO,10)
	TTCALL	3,[ASCIZ / ??
/]
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	JRST	QUIT
>
; (((↑↑↑)))

SUBTTL	System Dependent Routines for TENEX

; (((TENEX)))
IFG F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	MOVE	X1,[SIXBIT/DFTP/]
	SETNM
	HRRZI	X1,-1
	RFMOD
	TRZ	X2,006000	; (1B24+1B25)
	SFMOD
	MOVE	X2,[BYTE (2) 1,0,1,1,1,1,1,2,1,2,2,1,1,2,1,1,1,1]
	MOVE	X3,[BYTE (2) 0,1,1,0,1,1,0,1,1,3,1,1,1,2]
	SFCOC
	MOVEI	X1,400000	; FOR THIS FORK
	MOVE	X2,[LEVTAB,,CHNTAB]
	SIR			; SET UP INTERRUPT TABLES
	EIR			; ENABLE INTERRUPTS
	MOVE	X1,[17,,0]	; ↑O ON CHANNEL 0
	ATI
	MOVEI	X1,400000	; FOR THIS FORK
	MOVE	X2,[1B0+1B10+1B11+1B15] ; TTY, EOF, DATA ERROR, ILI
	AIC			; ACTIVATE CHANNELS
	SETZM	FLAGCO
	SETZM	FLAGEF
	SETZM	FLAG20
	MOVE	X1,[SIXBIT/LOADTB/]
	SYSGT
	SKIPN	X2
	 SETOM	FLAG20
	CALLR	ICP
	ENDR

; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL:	BEGINR	<BP,UTIL>
	MOVEI	X1,400000
	RUNTM
	IDIV	X3,X2
	MOVEM	X3,NTIME
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,FBUF]
	MOVNI	X3,GET$F
	SETOM	FLAGEF
	SIN
	SKIPN	FLAGEF
	 RETURN
	SETZM	FLAGEF
	MOVEI	BP,GET$F
	MOVEM	BP,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<FBUF-1>(BP)
	SOJG	BP,.-1
	ADDM	UTIL,NSUM
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,EBUF]
	MOVNI	X3,GET$E
	SIN
	MOVEI	BP,GET$E
	ADDM	BP,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<EBUF-1>(BP)
	SOJG	BP,.-1
	ADDM	UTIL,NSUM
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,PAGE]
	MOVNI	X3,GET$D
	SIN
	MOVEI	BP,GET$D
	ADDM	BP,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<PAGE-1>(BP)
	SOJG	BP,.-1
	ADDM	UTIL,NSUM
	MOVE	X1,[POINT 7,PAGE]
	SETZ	X2,
	IDTIM
	 SETZ	X2,
	MOVEM	X2,ABUF
	MOVE	X1,DCDJFN
	BIN
	AOS	NSIZE
	ADDM	X2,NSUM
	MOVEM	X2,<ABUF+1>
	BIN
	AOS	NSIZE
	ADDM	X2,NSUM
	MOVEM	X2,<ABUF+2>
	ENDR	SKIP,1

; GETDAT -- GET-RETRIEVE FILE DATA
;
GETDAT:	BEGINR	<IO,BP,UTIL>
	SETZ	UTIL,
	MOVE	X1,DCDJFN
	BIN
	ADDM	X2,NSUM
	MOVN	IO,X2
	ADDI	X2,3
	ADDM	X2,NSIZE
	JUMPE	IO,GETD2
GETD1:	CALLR	NETMSG
	 JRST	GETD7
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,PAGE]
	MOVNI	X3,SIZPAG
	CAMGE	X3,IO
	 MOVE	X3,IO
	SIN
	HRRZ	X1,LJFN
	MOVE	X2,[444400,,PAGE]
	MOVNI	X3,SIZPAG
	CAMGE	X3,IO
	 MOVE	X3,IO
	SKIPN	FLAGFE
	 SOUT
	MOVN	BP,IO
	CAILE	BP,SIZPAG
	 MOVEI	BP,SIZPAG
	ADD	UTIL,<PAGE-1>(BP)
	SOJG	BP,.-1
	ADDI	IO,SIZPAG
	JUMPL	IO,GETD1
GETD2:	MOVE	X1,DCDJFN
	BIN
	ADD	UTIL,X2
	ADDM	UTIL,NSUM
	BIN
	ADDM	X2,NSUM
	CAMN	X2,UTIL
	 JRST	GETD3
	TSOUT	<[ASCIZ/ (File checksum error)/],CRLF>
GETD3:	SKIPE	FLAGFE
	 JRST	GETD8
	HRROI	X1,LFILE
	HRRZ	X2,LJFN
	MOVE	X3,[022220,,000001]
	JFNS
	CALLR	LOCC
	SETO	X1,
	CAMN	X1,FSBUF
	 JRST	GETD4
	CAMN	X1,ESBUF
	 JRST	GETD4
	CAMN	X1,VSBUF
	 JRST	GETD4
	JRST	GETD5
GETD4:	HRROI	X1,[ASCIZ/  /]
	PSOUT
	HRROI	X1,LFILE
	PSOUT
	HRROI	X1,CRLF
	PSOUT
GETD5:	CALLR	LOCOI
	 JRST	GETD8
	MOVE	X3,<ABUF+2>
	JUMPLE	X3,GETD6
	HRR	X1,LJFN
	HRLI	X1,11		; OFFSET 11
	HRLZI	X2,007700	; BYTESIZE (B6-B11)
	LSH	X3,30
	CHFDB
	HRR	X1,LJFN
	HRLI	X1,12		; OFFSET 12 (BYTE COUNT)
	SETO	X2,
	MOVE	X3,<ABUF+1>
	CHFDB
GETD6:	SKIPN	ABUF
	 JRST	GETD8
	MOVEI	X1,400000
	RPCAP
	TRNN	X2,600000	; (1B18+1B19) WHEEL OR OPER
	 JRST	GETD8
	MOVE	UTIL,X3
	TRO	X3,(X2)
	EPCAP			; ENABLE (!)
	HRR	X1,LJFN
	HRLI	X1,14		; OFFSET 14 (LAST WRITE)
	SETO	X2,
	MOVE	X3,ABUF
	CHFDB
	MOVEI	X1,400000
	MOVE	X3,UTIL
	EPCAP			; RESET CAPABILITIES
	JRST	GETD8
GETD7:	MOVE	X1,DCDJFN
	SIBE
	 JRST	.+2
	JRST	GETD8
	BIN
	JRST	.-4
GETD8:	MOVEI	X1,400000
	RUNTM
	IDIV	X3,X2
	MOVE	X2,NTIME
	SUB	X3,X2
	MOVEM	X3,NTIME
	ENDR

; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL:	BEGINR	<BP,UTIL>
	MOVEI	X1,400000
	RUNTM
	IDIV	X3,X2
	MOVEM	X3,NTIME
	MOVE	BP,[POINT 7,PAGE]
	MOVE	UTIL,[POINT 7,FBUF]
	SCOPY	(UTIL,BP)
	MOVE	BP,UTIL
	MOVE	UTIL,[POINT 7,EBUF]
	SCOPY	(UTIL,BP)
	MOVE	BP,UTIL
	HRRZ	X1,LJFN
	MOVE	X2,[1,,14]	; 1 WORD, OFFSET 14 (LAST WRITE)
	HRRZI	X3,UBUF1
	GTFDB
	 JRST	PUTF1
	SETZ	X1,
	IDPB	X1,BP
	JRST	PUTF2
PUTF1:	MOVE	X1,BP
	MOVE	X2,UBUF1
	SETZ	X3,
	ODTIM
	IBP	X1
	MOVE	BP,X1
PUTF2:	GTAD
	MOVE	X2,X1
	MOVE	X1,BP
	ODTIM
	IBP	X1
	MOVEI	BP,(X1)
	MOVE	UTIL,VBUF
	MOVEM	UTIL,1(BP)
	ADDI	BP,1
	HRRZ	X1,LJFN
	MOVE	X2,[2,,11]	; 2 WORDS, OFFSET 11 (BYTESIZE & COUNT)
	HRRZI	X3,UBUF1
	GTFDB
	 JRST	PUTF3
	SETZM	UBUF1
	SETZM	<UBUF1+1>
PUTF3:	MOVE	UTIL,<UBUF1+1>
	MOVEM	UTIL,1(BP)
	LDB	UTIL,[300600,,UBUF1]
	MOVEM	UTIL,2(BP)
	ADDI	BP,2
	MOVEI	UTIL,1(BP)
	SUBI	UTIL,PAGE
	MOVEM	UTIL,NSIZE
	MOVEI	BP,-1(UTIL)
	SETZ	UTIL,
	ADD	UTIL,PAGE(BP)
	SOJGE	BP,.-1
	ADDM	UTIL,NSUM
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,PAGE]
	MOVN	X3,NSIZE
	SOUT
	ENDR

; PUTDAT -- PUT-STORE FILE DATA
;
PUTDAT:	BEGINR	<IO,BP,UTIL>
	CALLR	LOCS
	MOVE	X1,DCDJFN
	MOVE	X2,IO
	BOUT
	ADDM	X2,NSUM
	ADDI	X2,2
	ADDM	X2,NSIZE
	MOVN	IO,IO
	SETZ	UTIL,
	JUMPE	IO,PUTD2
PUTD1:	HRRZ	X1,LJFN
	MOVE	X2,[444400,,PAGE]
	MOVNI	X3,SIZPAG
	CAMGE	X3,IO
	 MOVE	X3,IO
	SIN
	CALLR	NETMSG
	 JRST	PUTD3
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,PAGE]
	MOVNI	X3,SIZPAG
	CAMGE	X3,IO
	 MOVE	X3,IO
	SOUT
	MOVN	BP,IO
	CAILE	BP,SIZPAG
	 MOVEI	BP,SIZPAG
	ADD	UTIL,<PAGE-1>(BP)
	SOJG	BP,.-1
	ADDI	IO,SIZPAG
	JUMPL	IO,PUTD1
PUTD2:	MOVE	X1,DCDJFN
	MOVE	X2,UTIL
	BOUT
	ADDM	UTIL,NSUM
	ADDM	UTIL,NSUM
	MOVEI	X2,21
	MTOPR
PUTD3:	MOVEI	X1,400000
	RUNTM
	IDIV	X3,X2
	MOVE	X2,NTIME
	SUB	X3,X2
	MOVEM	X3,NTIME
	ENDR

; EXAFIL -- EXAMINE FILE... READ AND LIST TO TERMINAL
;
EXAFIL:	BEGINR	<IO,BP,UTIL>
	MOVEI	X1,400000
	RUNTM
	IDIV	X3,X2
	MOVEM	X3,NTIME
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,FBUF]
	MOVNI	X3,GET$F
	SETOM	FLAGEF
	SIN
	SKIPN	FLAGEF
	 RETURN
	SETZM	FLAGEF
	MOVEI	BP,GET$F
	MOVEM	BP,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<FBUF-1>(BP)
	SOJG	BP,.-1
	ADDM	UTIL,NSUM
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,EBUF]
	MOVNI	X3,GET$E
	SIN
	MOVEI	BP,GET$E
	ADDM	BP,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<EBUF-1>(BP)
	SOJG	BP,.-1
	ADDM	UTIL,NSUM
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,PAGE]
	MOVNI	X3,GET$D
	SIN
	MOVEI	BP,GET$D
	ADDM	BP,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<PAGE-1>(BP)
	SOJG	BP,.-1
	ADDM	UTIL,NSUM
	MOVE	X1,DCDJFN
	BIN
	AOS	NSIZE
	ADDM	X2,NSUM
	BIN
	AOS	NSIZE
	ADDM	X2,NSUM
	SKIPL	DEXA$S
	 JRST	EXAF0
	MOVE	X2,[440700,,FBUF]
	ILDB	X1,X2
	CAILE	X1," "
	 JRST	.-2
	SETZ	X1,
	DPB	X1,X2
	MOVE	X2,[440700,,EBUF]
	ILDB	X1,X2
	CAILE	X1," "
	 JRST	.-2
	SETZ	X1,
	DPB	X1,X2
	TSOUT	<[ASCIZ/ [/],FBUF,[ASCIZ/./],EBUF,[ASCIZ/]/],CRLF>
EXAF0:	SETZ	UTIL,
	MOVE	X1,DCDJFN
	BIN
	ADDM	X2,NSUM
	MOVN	IO,X2
	ADDI	X2,3
	ADDM	X2,NSIZE
	JUMPE	IO,EXAF2
EXAF1:	CALLR	NETMSG
	 JRST	EXAF3
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,PAGE]
	MOVNI	X3,SIZPAG
	CAMGE	X3,IO
	 MOVE	X3,IO
	SIN
	PUSH	STAK,IO
	MOVNI	X1,SIZPAG
	CAMGE	X1,IO
	 MOVE	X1,IO
	MOVN	IO,X1
	IMULI	IO,5
	MOVE	BP,[440700,,PAGE]
	CALLR	DEXA$
	POP	STAK,IO
	MOVN	BP,IO
	CAILE	BP,SIZPAG
	 MOVEI	BP,SIZPAG
	ADD	UTIL,<PAGE-1>(BP)
	SOJG	BP,.-1
	ADDI	IO,SIZPAG
	JUMPL	IO,EXAF1
EXAF2:	MOVE	X1,DCDJFN
	BIN
	ADD	UTIL,X2
	ADDM	UTIL,NSUM
	BIN
	ADDM	X2,NSUM
	CAMN	X2,UTIL
	 JRST	EXAF4
	TSOUT	<[ASCIZ/ (File checksum error)/],CRLF>
	JRST	EXAF4
EXAF3:	MOVE	X1,DCDJFN
	SIBE
	 JRST	.+2
	JRST	.+3
	BIN
	JRST	.-4
	MOVEI	X1,400000
	RUNTM
	IDIV	X3,X2
	MOVE	X2,NTIME
	SUB	X3,X2
	MOVEM	X3,NTIME
	RETURN
EXAF4:	MOVEI	X1,400000
	RUNTM
	IDIV	X3,X2
	MOVE	X2,NTIME
	SUB	X3,X2
	MOVEM	X3,NTIME
	ENDR	SKIP,1

; TENEX ICP:		1) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			2) OPEN CONNECTION SOCKETS
;				A) EVEN - INPUT
;				B) ODD - OUTPUT
; JFN STRING:	"NET:<JOB-RELATIVE-SKT>.<FOREIGN-HST>-<FOREIGN-SKT>"
;
ICP:	BEGINR
	MOVE	X1,[POINT 7,UBUF1]
	HRROI	X2,[ASCIZ/NET:20./]
	SETZ	X3,
	SOUT			; LOCAL SOCKET 20+JOBREL
	MOVEI	X2,DCHOST
	MOVEI	X3,10
	CVHST
	 NOUT			; FAILURE -- MAKE HOST # INTO STRING
	 JRST	.+1		; CVHST SUCCESS OR NOUT FAILURE
	MOVN	X2,DCSOCK
	NOUT
	 JRST	.+1
	HRLZI	X1,1	; SHORT GTJFN
	HRROI	X2,UBUF1
	GTJFN			; ICP CONNECTION
	 JRST	ICPEG
	MOVE	X2,[40B5+1B19] ; 32-BIT, READ
	OPENF			; OPEN ICP CONNECTION
	 JRST	ICPEO
	BIN
	MOVEM	X2,ICPSOC
	CLOSF
	 JRST	ICPEC
	MOVE	X1,[POINT 7,UBUF1]
	HRROI	X2,[ASCIZ/NET:22./]
	SETZ	X3,
	SOUT
	MOVEI	X2,DCHOST
	MOVEI	X3,10
	CVHST
	 NOUT
	 JRST	.+1
	MOVN	X2,ICPSOC
	NOUT
	 JRST	.+1
	HRLZI	X1,1
	HRROI	X2,UBUF1
	GTJFN			; OUTPUT JFN
	 JRST	ICPEIG
	MOVEM	X1,DCOJFN
	HRLZI	X1,1
	HRROI	X2,UBUF1
	GTJFN			; INPUT JFN
	 JRST	ICPEOG
	MOVEM	X1,DCIJFN
	MOVE	X2,[10B5+6B9+1B19] ; 8-BIT, NO-WAIT, READ
	OPENF
	 JRST	ICPEIO
	MOVE	X1,DCOJFN
	MOVE	X2,[10B5+7B9+1B20] ; 8-BIT, NO-WAIT-BUFFERED, WRITE
	OPENF
	 JRST	ICPEOO
	MOVE	X1,[SIXBIT/LHOSTN/]
	SYSGT
	MOVEM	X1,LHOST
	ENDR

; NETWORK QUIT
;
QUIT:	MOVE	X1,DCOJFN
	MOVEI	X2,"Z"-100
	BOUT
	MOVEI	X2,21
	MTOPR
	SETOM	FLAGEF
QUIT01:	DCBIN	<IO>
	SKIPE	FLAGEF
	 JRST	QUIT01
	RESET
	HALTF
	JRST	.-1		; IN CASE OF "CONTINUE"

; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
	MOVE	X1,[POINT 7,UBUF1]
	HRROI	X2,[ASCIZ/NET:24./]
	SETZ	X3,
	SOUT
	MOVEI	X2,DCHOST
	MOVEI	X3,10
	CVHST
	 NOUT
	 JRST	.+1
	MOVN	X2,ICPSOC
	SUBI	X2,3
	NOUT
	 JRST	.+1
	HRLZI	X1,1
	HRROI	X2,UBUF1
	GTJFN
	 JRST	NETOI2
	MOVEM	X1,DCDJFN
	MOVE	X2,[44B5+6B9+1B19] ; 36-BIT, NO-WAIT, READ
	OPENF
	 JRST	NETOI1
	RETURN	SKIP,1
NETOI1:	RLJFN
	 JRST	NETOI2
NETOI2:	HRROI	X1,[ASCIZ/ ?? Network connection OPEN failure ??
/]
	PSOUT
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
	MOVE	X1,[POINT 7,UBUF1]
	HRROI	X2,[ASCIZ/NET:25./]
	SETZ	X3,
	SOUT
	MOVEI	X2,DCHOST
	MOVEI	X3,10
	CVHST
	 NOUT
	 JRST	.+1
	MOVN	X2,ICPSOC
	SUBI	X2,2
	NOUT
	 JRST	.+1
	HRLZI	X1,1
	HRROI	X2,UBUF1
	GTJFN
	 JRST	NETOO2
	MOVEM	X1,DCDJFN
	MOVE	X2,[44B5+7B9+1B20] ; 36-BIT, NO-WAIT-BUFFERED, WRITE
	OPENF
	 JRST	NETOO1
	RETURN	SKIP,1
NETOO1:	RLJFN
	 JRST	NETOO2
NETOO2:	HRROI	X1,[ASCIZ/ ?? Network connection OPEN failure ??
/]
	PSOUT
	ENDR

; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
	MOVE	X1,DCDJFN
	CLOSF
	 JRST	NETC1
	RETURN
NETC1:	HRROI	[ASCIZ/ ?? Network connection CLOSE failure ??
/]
	PSOUT
	ENDR

; NETMSG -- HANDLE PENDING MESSAGES
;
NETMSG:	BEGINR
	SKIPE	FLAGSM
	 RETURN	SKIP,1
NETMS1:	MOVE	X1,DCIJFN
	SIBE
	 JRST	.+2
	RETURN	SKIP,1
	BIN
	CAIN	X2,"!"
	 JRST	NETMS2
	CAIN	X2,"+"
	 JRST	NETMS3
	CAIN	X2,"-"
	 JRST	NETMS3
	CAIN	X2,"."
	 JRST	NETMS4
	CAIN	X2,"?"
	 JRST	DEATH
	CALLR	RENLIN
	JRST	NETMS1
NETMS2:	CALLR	RENLIP
	JRST	NETMS1
NETMS3:	CALLR	RENLIP
	RETURN
NETMS4:	SETOM	FLAGSM
	CALLR	RENLIN
	ENDR	SKIP,1

; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
;   OUT: UTIL
;
NETDSI:	BEGINR
	GJINF
	HRRZI	UTIL,(X2)	; CONNECT DIRECTORY
	LSH	UTIL,↑D15	; PAST 5 LOW DIGITS
	ADDI	UTIL,24
	ENDR

; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
;   OUT: UTIL
;
NETDSO:	BEGINR
	GJINF
	HRRZI	UTIL,(X2)	; CONNECT DIRECTORY
	LSH	UTIL,↑D15	; PAST 5 LOW DIGITS
	ADDI	UTIL,25
	ENDR

; NETFFI -- NETWORK FIX FIRST FILE NAME
;
NETFFI:	BEGINR
	MOVE	X2,LJFN
	TLNN	X2,770000
	 JRST	NETFI1
	HRROI	X1,LFILE
	HRRZI	X2,(X2)
	SETZ	X3,
	JFNS
	MOVE	X1,[LFILE,,UBUF2]
	CALLR	LUTVR
	HRROI	X1,[ASCIZ/  /]
	PSOUT
	HRROI	X1,UBUF2
	PSOUT
	HRROI	X1,CRLF
	PSOUT
NETFI1:	SKIPN	GBUF1
	 JRST	NETFI2
	HRROI	X1,UBUF2
	HRRZ	X2,LJFN
	HRLZI	X3,002000
	JFNS
	MOVE	X1,[UBUF2,,FBUF]
	CALLR	LUTVR
NETFI2:	SKIPN	GBUF2
	 JRST	NETFI3
	HRROI	X1,UBUF2
	HRRZ	X2,LJFN
	HRLZI	X3,000200
	JFNS
	MOVE	X1,[UBUF2,,EBUF]
	CALLR	LUTVR
NETFI3:	SKIPL	VSBUF
	 RETURN
	MOVN	X1,VBUF
	MOVEM	X1,VSBUF
	ENDR

; FATAL NETWORK ERROR MESSAGES
;
NETEQ:	PSOUT
	RESET
	HALTF
	JRST	.-1
ICPEG:	HRROI	X1,[ASCIZ/ The datacomputer is unavailable (network)./]
	JRST	NETEQ
ICPEO:	HRROI	X1,[ASCIZ/ The datacomputer is unavailable (down)./]
	JRST	NETEQ
ICPEC:	HRROI	X1,[ASCIZ/ ?? ICP CLOSF failure ??/]
	JRST	NETEQ
ICPEOG:	HRROI	X1,[ASCIZ/ ?? ICP output GTJFN failure ??/]
	JRST	NETEQ
ICPEIG:	HRROI	X1,[ASCIZ/ ?? ICP input GTJFN failure ??/]
	JRST	NETEQ
ICPEIO:	HRROI	X1,[ASCIZ/ ?? ICP output OPENF failure ??/]
	JRST	NETEQ
ICPEOO:	HRROI	X1,[ASCIZ/ ?? ICP input OPENF failure ??/]
	JRST	NETEQ

; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR
	HRLZI	X1,100101	; OLD FILE, *'S, SHORT CALL
	MOVE	X2,[POINT 7,LFILE]
	GTJFN
	 JRST	LOCOI1
	MOVEM	X1,LJFN
	HRRZI	X1,(X1)
	MOVE	X2,[440000,,200000] ; 36-BIT, READ
	OPENF
	 JRST	LOCOI2
	RETURN	SKIP,1
LOCOI1:	HRROI	X1,[ASCIZ/ (Local file not found)
/]
	PSOUT
	RETURN
LOCOI2:	HRROI	X1,[ASCIZ/ (Local file not available)
/]
	PSOUT
	HRRZ	X1,LJFN
	RLJFN
	 RETURN
	ENDR

; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR
	HRLZI	X1,600001	; VN, WRITE, SHORT
	MOVE	X2,[POINT 7,LFILE]
	GTJFN
	 JRST	LOCOO2
	MOVEM	X1,LJFN
	MOVE	X2,[440000,,100000] ; 36 BIT BYTE, READ
	OPENF
	 JRST	LOCOO1
	RETURN	SKIP,1
LOCOO1:	HRRZ	X1,LJFN
	RLJFN
	 JRST	.+1
LOCOO2:	HRROI	X1,[ASCIZ/ (Local file creation failure)
/]
	PSOUT
	ENDR

; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	SKIPE	FLAGFE
	 RETURN
	HRRZ	X1,LJFN
	CLOSF
	 JRST	LOCC1
	RETURN
LOCC1:	HRROI	X1,[ASCIZ/ ?? Local file CLOSE failure ??
/]
	PSOUT
	ENDR

; LOCS -- LOCAL (FILE) SIZE
;   OUT: IO -- SIZE IN WORDS
;
LOCS:	BEGINR
	HRRZ	X1,LJFN
	MOVE	X2,[2,,11]	; READ 2 WORDS, OFFSET OF 11
	HRRZI	X3,UBUF1
	GTFDB
	 JRST	.+3
	SETZ	IO,
	RETURN
	LDB	X1,[300600,,UBUF1] ; FILE BYTESIZE IS B6-11
	MOVEI	X2,↑D36
	IDIVI	X2,(X1)	; BYTES/WD
	MOVE	X3,UBUF1+1	; BYTE COUNT TO EOF
	ADDI	X3,-1(X2)	; ACCOUNT FOR TRUNCATION
	IDIVI	X3,(X2)	; NUMBER OF WORDS
	MOVE	IO,X3
	ENDR

; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI:	BEGINR
	SETZM	GBUF1
	LDB	X1,[350700,,FBUF]
	CAIN	X1,"*"
	 SETOM	GBUF1
	SETZM	GBUF2
	LDB	X1,[350700,,EBUF]
	CAIN	X1,"*"
	 SETOM	GBUF2
	CALLR	LOCOI
	 RETURN
	SKIPE	GBUF1
	 JRST	LOCFI0
	SKIPE	GBUF2
	 JRST	LOCFI0
	CALLR	LOCC
	RETURN	SKIP,1
LOCFI0:	HRROI	X1,UBUF2
	HRRZ	X2,LJFN
	MOVE	X3,[002200,,000001]
	JFNS
	CALLR	LOCC
	HRRZI	X1,UBUF2
	CALLR	LUTVF
	 JRST	.+2
	RETURN	SKIP,1
	MOVE	X1,[UBUF2,,UBUF2]
	CALLR	LUTVR
	HRROI	X1,[ASCIZ/ (Bad remote file name /]
	PSOUT
	HRROI	X1,UBUF2
	PSOUT
	HRROI	X1,[ASCIZ/)
/]
	PSOUT
	ENDR

; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI:	BEGINR
	HRRZ	X1,LJFN
	TLO	X1,400000
	CLOSF
	 JRST	.+1
LOCNI1:	MOVE	X1,LJFN
	GNJFN
	 RETURN	SKIP,1
	HRRZI	X1,(X1)
	MOVE	X2,[440000,,200000] ; 36-BIT, READ
	OPENF
	 JRST	LOCNI1
	SKIPL	VSBUF
	 JRST	LOCNI2
	MOVE	X1,[LFILE,,UBUF1]
	BLT	X1,<UBUF1+SBSIZE-1>
LOCNI2:	HRROI	X1,LFILE
	HRRZ	X2,LJFN
	SETZ	X3,
	JFNS
	MOVE	X1,[LFILE,,UBUF2]
	CALLR	LUTVR
	HRROI	X1,[ASCIZ/  /]
	PSOUT
	HRROI	X1,UBUF2
	PSOUT
	HRROI	X1,CRLF
	PSOUT
	SKIPL	VSBUF
	 JRST	LOCNI5
	MOVE	X1,[440700,,LFILE]
	MOVE	X2,[440700,,UBUF1]
LOCNI3:	ILDB	X3,X1
	ILDB	X4,X2
	CAIE	X3,(X4)
	 JRST	LOCNI4
	CAIE	X3,";"
	 JUMPN	X3,LOCNI3
	AOS	VBUF
	JRST	LOCNI5
LOCNI4:	MOVN	X1,VSBUF
	MOVEM	X1,VBUF
LOCNI5:	SKIPN	GBUF1
	 JRST	LOCNI6
	HRROI	X1,UBUF2
	HRRZ	X2,LJFN
	HRLZI	X3,002000
	JFNS
	HRRZI	X1,UBUF2
	CALLR	LUTVF
	 JRST	LOCNI7
	MOVE	X1,[UBUF2,,FBUF]
	CALLR	LUTVR
LOCNI6:	SKIPN	GBUF2
	 RETURN
	HRROI	X1,UBUF2
	HRRZ	X2,LJFN
	HRLZI	X3,000200
	JFNS
	HRRZI	X1,UBUF2
	CALLR	LUTVF
	 JRST	LOCNI7
	MOVE	X1,[UBUF2,,EBUF]
	CALLR	LUTVR
	RETURN
LOCNI7:	HRROI	X1,[ASCIZ/ (Bad remote file name)
/]
	PSOUT
	HRRZ	X1,LJFN
	TLO	X1,400000
	CLOSF
	 JRST	LOCNI1
	JRST	LOCNI1
	ENDR

; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO:	BEGINR
	SETZ	X1,
	SETO	X2,
	CAMN	X2,FSBUF
	 TRO	X1,400000
	CAMN	X2,ESBUF
	 TRO	X1,200000
	CAMN	X2,VSBUF
	 TRO	X1,100000
	JUMPE	X1,RETN(0)
	MOVE	X2,[POINT 7,LFILE]
	MOVE	X3,[POINT 7,FSBUF]
	TRNE	X1,400000
	 HRRI	X3,FBUF
	ILDB	X4,X3
	CAIN	X4," "
	 SETZ	X4,
	IDPB	X4,X2
	JUMPN	X4,.-4
	SKIPN	ESBUF
	 JRST	LOCNO0
	MOVEI	X4,"."
	DPB	X4,X2
	MOVE	X3,[POINT 7,ESBUF]
	TRNE	X1,200000
	 HRRI	X3,EBUF
	ILDB	X4,X3
	CAIN	X4," "
	 SETZ	X4,
	IDPB	X4,X2
	JUMPN	X4,.-4
LOCNO0:	SKIPG	VSBUF
	 RETURN
	MOVEI	X4,";"
	DPB	X4,X2
	MOVE	X1,X2
	MOVE	X2,VSBUF
	MOVEI	X3,↑D10
	NOUT
	 THUD
	ENDR

; LUTVF -- LOCAL UTILITY: VERIFY FILENAME
;   IN: X1 -- POINTER TO STRING TO VERIFY
;
LUTVF:	BEGINR	<X1,X2,X3>
	HRLI	X1,440700
LUTVF0:	ILDB	X2,X1
	JUMPE	X2,RETN(1)
	CAIN	X2,"."
	 JRST	LUTVF0
	CAIN	X2,";"
	 JRST	LUTVF0
	CAIN	X2,"*"
	 JRST	LUTVF0
	CAIN	X2,"V"-100
	 ILDB	X2,X1
	CAIG	X2," "
	 RETURN
	CAIN	X2,"."
	 RETURN
	CAIN	X2,";"
	 RETURN
	CAIN	X2,"*"
	 RETURN
	CAIN	X2,"?"
	 RETURN
	CAIN	X2,":"
	 RETURN
	CAIN	X2,"'"
	 RETURN
	CAIN	X2,42
	 RETURN
	CAIN	X2,"<"
	 RETURN
	CAIN	X2,">"
	 RETURN
	CAIN	X2,177
	 RETURN
	CAIL	X2,"A"+40
	 CAILE	X2,"Z"+40
	  JRST	LUTVF0
	ENDR

; LUTVR -- LOCAL UTILITY: ↑V REMOVAL
;   IN: X1 -- SOURCE,,DESTINATION
;
LUTVR:	BEGINR	<X1,X2,X3>
	HLR	X2,X1
	HRLI	X1,440700
	HRLI	X2,440700
LUTVR0:	ILDB	X3,X2
	CAIN	X3,"V"-100
	 ILDB	X3,X2
	IDPB	X3,X1
	JUMPN	X3,LUTVR0
	ENDR

; PSEUDO-INTERRUPT ROUTINES
;
TCOPSI:	SETOM	FLAGCO
	DEBRK
EOFPSI:	SKIPN	FLAGEF
	 JRST	EOFPSE
	SETZM	FLAGEF
	DEBRK			; RETURN FROM INTERRUPT
EOFPSE:	MOVE	UTIL,X1
	HRROI	X1,[ASCIZ/ ?? Unexpected EOF at /]
	PSOUT
	MOVEI	X1,101
	HRRZ	X2,PSIPC1
	SUBI	X2,1
	MOVEI	X3,10
	SETZ	X4,
	NOUT
	 JRST	.+1
	HRROI	X1,[ASCIZ/ ??
/]
	PSOUT
	MOVE	X1,(X2)
	CAMN	X1,[BIN]
	 JRST	EOFPSD
	CAMN	X1,[BOUT]
	 JRST	EOFPSD
	CAMN	X1,[SIN]
	 JRST	EOFPSD
	CAMN	X1,[SOUT]
	 JRST	EOFPSD
	MOVEI	X1,PSIQUI
	MOVEM	X1,PSIPC1
	DEBRK
EOFPSD:	CAMN	UTIL,DCDJFN
	 JRST	.+4
	MOVEI	X1,PSIQUI
	MOVEM	X1,PSIPC1
	DEBRK
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	MOVEI	X1,QUIT
	MOVEM	X1,PSIPC1
	DEBRK
DERPSI:	MOVE	UTIL,X1
	HRROI	X1,[ASCIZ/ ?? Data error at /]
	PSOUT
	MOVEI	X1,101
	HRRZ	X2,PSIPC1
	SUBI	X2,1
	MOVEI	X3,10
	SETZ	X4,
	NOUT
	 JRST	.+1
	HRROI	X1,[ASCIZ/ ??
/]
	PSOUT
	MOVE	X1,(X2)
	CAMN	X1,[BIN]
	 JRST	DERPSD
	CAMN	X1,[BOUT]
	 JRST	DERPSD
	CAMN	X1,[SIN]
	 JRST	DERPSD
	CAMN	X1,[SOUT]
	 JRST	DERPSD
	MOVEI	X1,PSIQUI
	MOVEM	X1,PSIPC1
	DEBRK
DERPSD:	CAMN	UTIL,DCDJFN
	 JRST	.+4
	MOVEI	X1,PSIQUI
	MOVEM	X1,PSIPC1
	DEBRK
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	MOVEI	X1,QUIT
	MOVEM	X1,PSIPC1
	DEBRK
ILIPSI:	HRROI	X1,[ASCIZ/ ?? Illegal instruction at /]
	CAMN	X2,[-1]
	 HRROI	X1,[ASCIZ/ ?? Impossible event at /]
	PSOUT
	MOVEI	X1,101
	HRRZ	X2,PSIPC1
	SUBI	X2,1
	MOVEI	X3,10
	SETZ	X4,
	NOUT
	 JRST	.+1
	HRROI	X1,[ASCIZ/ ??
/]
	PSOUT
	MOVEI	X1,PSIQUI
	MOVEM	X1,PSIPC1
	DEBRK
PSIQUI:	HALTF
	JRST	PSIQUI
>
; (((↑↑↑)))

SUBTTL	Pure Data

CRLF:	BYTE	(7)15,12,0,0,0
SEMI:	BYTE	(7)";",15,12,0,0

HOSTS:	5,,[ASCIZ/BBN/]			; TENEXE
	11,,[ASCIZ/HARVARD/]
	13,,[ASCIZ/SUAI/]
	37,,[ASCIZ/CCA/]
	40,,[ASCIZ/PARC/]
	43,,[ASCIZ/ISI/]		; ISIR1
	53,,[ASCIZ/OFFICE"-1/]
	56,,[ASCIZ/RUTGERS/]
	61,,[ASCIZ/BBN/]		; TENEXB
	62,,[ASCIZ/BBN/]		; TENEXF
	63,,[ASCIZ/SRI/]		; SRI-KA
	70,,[ASCIZ/SUMEX/]
	102,,[ASCIZ/SRI/]		; SRI-KL
	106,,[ASCIZ/ITS/]		; DMS
	126,,[ASCIZ/ISI/]		; ISIA
	161,,[ASCIZ/BBN/]		; TENEXD
	164,,[ASCIZ/ISI/]		; ISIE
	206,,[ASCIZ/ITS/]		; AI
	226,,[ASCIZ/ISI/]		; ISIC
	305,,[ASCIZ/BBN/]		; TENEXA
	306,,[ASCIZ/ITS/]		; ML
	326,,[ASCIZ/ISI/]		; ISID
	354,,[ASCIZ/ITS/]		; MC
	361,,[ASCIZ/BBN/]		; TENEXC
	364,,[ASCIZ/ISI/]		; ISIB
	0

	LIT			; LITERALS GO HERE

SUBTTL	Impure Data

; (((ITS)))
IFL F.TENX,<
IOBUFR:	BLOCK 2000
LCLDEV:	BLOCK 1			; local device
LCLFN1:	BLOCK 1
LCLFN2:	BLOCK 1
LCLSNM:	BLOCK 1			; SNAME
RCHBLK:	BLOCK 10		; network status goes here
LCLRCV:	BLOCK 1
LCLTRN:	BLOCK 1
FORRCV:	BLOCK 1
FORTRN:	BLOCK 1
FFITYP:	BLOCK 1
LCLDAT:	BLOCK 1
DIRBLK:	BLOCK 2000
>
; (((↑↑↑)))

; (((TOPS-10)))
IFE F.TENX,<
	RELOC	0

; (((NOT SAIL)))
IFE F.SAIL,<
ICPBLK:	SIXBIT	/IMP/
	0
	100			; LOCAL SOCKET
	40,,DCHOST		; 32 BIT BYTES (ICP), CCA HOST
	DCSOKT			; DATACOMPUTER SOCKET
DCIBLK:	SIXBIT	/IMP/
	0
	102			; LOCAL SOCKET
	10,,DCHOST		; 8 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP + 1
DCOBLK:	SIXBIT	/IMP/
	0
	103			; LOCAL SOCKET
	10,,DCHOST		; 8 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP
DCDBLK:	SIXBIT	/IMP/
	0
	0			; LOCAL SOCKET (104 RECEIVE, 105 SEND)
	44,,DCHOST		; 36 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP +2 OR +3
WRKBLK:	BLOCK	5
ICCHAS:	10			; IMAGE MODE
	SIXBIT	/IMP/
	0,,ICPBUF
ICPBUF:	BLOCK	3
DCCHAS:	0			; 7 BIT ASCII MODE
	SIXBIT	/IMP/
	DCOBUF,,DCIBUF
>
; (((↑↑↑)))
DCIBUF:	BLOCK	3
DCOBUF:	BLOCK	3
DDCHAS:	13			; BINARY
	SIXBIT	/IMP/
	DDOBUF,,DDIBUF
DDIBUF:	BLOCK	3
DDOBUF:	BLOCK	3

IFE F.SAIL,<
LFILEB:	0,,5			; EXTENDED LOOKUP-ENTER
>
LFIPPN:	0			; PPN
LFILE:	0			; FILE NAME
	0			; EXTENSION AND DATES
	0			; MODE AND DATES
	0			; SIZE IN WORDS
LFCHAS:	13			; BINARY MODE
	SIXBIT	/DSK/
	LFOBUF,,LFIBUF
LFIBUF:	BLOCK	3
LFOBUF:	BLOCK	3

LDIR:	0			; PROJ-PROG OF USER
	0			; "UFD"
	0
	0			; [1,1]
LDCHAS:	13
	SIXBIT	/DSK/
	0,,LDIBUF
LDIBUF:	BLOCK	3
LUTDSP:	0
LUTDSF:	BLOCK	SBSIZE

EXABUF:	BLOCK	SIZBLK

; (((SAIL)))
IFN F.SAIL,<
CONECB:	BLOCK 7

; OTHER RANDOM THINGS

TERBLK:	3			; TERMINATE BLOCK
	0			; STATUS BITS
	1			; FOREIGN SOCKET LOC
	0			; DON'T WAIT

STTBLK:	2
	BLOCK 2
>
; (((↑↑↑)))
>
; (((↑↑↑)))

; (((TENEX)))
IFG F.TENX,<
LEVTAB:	PSIPC1
	PSIPC2
	PSIPC3
PSIPC1:	BLOCK	1
PSIPC2:	BLOCK	1
PSIPC3:	BLOCK	1
CHNTAB:	1,,TCOPSI
	REPEAT 9,<EXP 0>
	1,,EOFPSI
	1,,DERPSI
	REPEAT 3,<EXP 0>
	1,,ILIPSI
	REPEAT ↑D20,<EXP 0>
FLAGCO:	0
FLAGEF:	0
FLAG20:	0

DCSOCK:	DCSOKT
ICPSOC:	0			; ICP SOCKET
DCIJFN:	0			; DC INPUT JFN
DCOJFN:	0			; DC OUTPUT JFN
DCDJFN:	0			; DC DATA JFN

LFILE:	BLOCK	SBSIZE
LJFN:	0
LDIR:	0

VSBUF:	0

PAGE:	BLOCK	SIZPAG
>
; (((↑↑↑)))

; * VARIABLES

CMDMOD:	0

LHOST:	0

ANCHOR:	ASCIZ	/DFTP/
	BLOCK	<SBSIZE-2>
CONTEX:	BLOCK	LBSIZE
OPENED:	BLOCK	LBSIZE
OPENEM:	0

FLAGDD:	0
FLAGDE:	0
FLAGFE:	0
FLAGNN:	0
FLAGTT:	0
IFN F.TENX!F.SAIL,<
 FLAGSM: 0	; Tenex, Twenex, ITS, SAIL use FLAGSM; Bottoms-10 does not
>
DEXA$L:	0
DEXA$P:	0
DEXA$S:	0

; * BLOCKS

NBUF:	BLOCK	LBSIZE
FBUF:	BLOCK	SBSIZE
EBUF:	BLOCK	SBSIZE
VBUF:	0
FSBUF:	BLOCK	SBSIZE
ESBUF:	BLOCK	SBSIZE

ABUF:	BLOCK	SBSIZE
UBUF1:	BLOCK	LBSIZE
UBUF2:	BLOCK	SBSIZE
GBUF1:	BLOCK	LBSIZE
GBUF2:	BLOCK	LBSIZE

NTIME:	0
NSIZE:	0
NSUM:	0

TCIPCL:	BLOCK	100		; P(OSSIBLE)C(OMMAND)L(IST) [INIT ALL]
TCIPLP:	0			; TCIPCL PTRS (# POSSIBLITIES,,LIST ADR)
	BLOCK	37		;   (SIZE = # CHARS IN LARGEST CMD)
TCIPNF:	0			; P(OSSIBLE)N(EXT)F(REE)

	STSIZ==100
STBEG:	BLOCK	STSIZ

	VAR

	-1			; CRETINOUS LINK-10 BUG

	END	DFTP